私が2つの独立した変更をoneファイルで行った場合を考えてみましょう。新しいメソッドを追加し、別のメソッドを変更しました。
多くの場合、両方の変更をonecommitとしてコミットしたくないが、two独立したコミット。
Gitリポジトリでは、Interactive Modeof git-add(1) を使用してhunkをより小さなものに:
git add --patch
Subversionでこれを行う最も簡単な方法は何ですか? (Eclipseプラグインを使用している場合もあります)
更新:
The Thing About Git では、ライアンは次のように呼びます:「The Tangled Working Copy Problem」
Git-svnを使用すると、リモートSVNリポジトリのローカルGITリポジトリを作成し、完全なGIT機能セット(部分コミットを含む)を使用して操作し、それをすべてSVNリポジトリにプッシュバックできます。
Tortoise SVN 1.8 現在サポート これは「コミット後に復元」機能です。これにより、ファイルの編集が可能になり、コミット後にすべての編集が取り消されます。
ドキュメントごと:
特定の1つの問題に関連するファイルの部分のみをコミットするには:
- コミットダイアログで、ファイルを右クリックし、「コミット後に復元」を選択します
- ファイルを編集しますTortoiseMerge:まだコミットしたくない変更を元に戻します
- ファイルを保存する
- ファイルをコミットする
TortoiseSVN を使用してこれを実行しました。
組み込みのマージユーティリティを使用すると、リポジトリバージョンと作業コピーの差分を表示できます。
Diffユーティリティのcreate backup関数を使用します
これで、2つの別個のコミットを使用して、すべての変更をコミットする必要があります。
svn diff > out.patch
を使用してから、out.patch
ファイルをout.patch.add
およびout.patch.modify
にコピーしてください
パッチファイルが機能している場合のみsvn revert out.c
を使用して元のファイルを元に戻します。
パッチファイルを手動で編集して、追加または変更用のhunksのみを含めるようにします。 patch
コマンドを使用してそれらを元のファイルに適用し、追加が機能するかどうかをテストしてから、追加をsvn commit
.
out.patch.modify
パッチの洗い流しを繰り返します。
最初の質問で述べたように、ファイル内の変更が個別の場合-新しいメソッドを追加し、既存のメソッドを変更した-これは機能します
これは非常に退屈な解決策です-コミットを分離する理由があるべきだとは思いませんが。
同じソースの複数の作業コピーをチェックアウトして、作業を次の対象に適用することもできます。
svn co http://location/repository methodAdd
svn co http://location/repository methodModify
必ずsvn up
をテストして、すべてが正常であることを確認してください。
これは、v1.8以降のTortoiseSvn(Windows)を使用して可能です。
4.4.1。コミットダイアログ
作業コピーが最新であり、競合がない場合は、変更をコミットする準備ができています。コミットしたいファイルやフォルダを選択し、TortoiseSVN→コミット...を選択します。
<スニップ>
4.4.3。ファイルの一部のみをコミットする
ファイルに加えた変更の一部のみをコミットしたい場合があります。このような状況は通常、何かに取り組んでいるときに緊急の修正をコミットする必要があり、その修正が作業中の同じファイルにある場合に発生します。
ファイルを右クリックし、コンテキストメニュー→コミット後に復元を使用します。これにより、ファイルのコピーがそのまま作成されます。その後、ファイルを編集できます。 TortoiseMergeで、コミットしたくないすべての変更を元に戻します。これらの変更を保存したら、ファイルをコミットできます。
コミットが完了すると、ファイルのコピーが自動的に復元され、コミットされていないすべての変更を含むファイルが作成されます。
Linuxでは、 http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php を試してみます。しかし、自分で試したことはありません。
私はこれを行うために使用します:
これは、1セットの変更を元に戻すのがかなり簡単であると仮定する単純なアプローチです。より複雑な状況では、心配せずに両方の変更をあきらめてコミットします。
Gitを使用するようになったので、これはもう二度とする必要がないことを願っています!
ローカルdarcsリポジトリを使用するか、変更を徐々にマージします。マージの場合(opendiffは、Xcodeに付属のマージプログラムであるFileMergeを開きます。お気に入りのマージツールに置き換えます):
cp file file.new
svn revert file
opendiff file.new file -merge file
関連する変更をマージし、マージを保存して、マージプログラムを終了します
svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file
ファイル内に複数の無関係なハンクがある場合は、すすいで繰り返します(しかし、コミットするのになぜそんなに長く待つのですか?!)
また、gitを知っている場合は、 git-svn を使用してローカルgitリポジトリを維持し、コミットをsvnマスターサーバーに同期できます。私の限られた経験で素晴らしい作品。
Visual StudioのVisualSVN を試してください。 最新6.1リリース は、QuickCommit機能を導入します。 Visual Studioエディターの新しいCommit this BlockおよびCommit Selectionコンテキストメニューコマンドを使用して、ファイル内の選択した変更を部分的にコミットできます。 。
Spikeの完全な提案よりも少し危険ですが、より簡単にすることができます。また、一部のエディターは、そのファイルをリロードしない限り(すべての変更を失う)、その下から変更されたファイルの保存を拒否するため、最初に他の何かで試してください
差分ファイルの生成や復帰などよりも簡単なオプションは、リポジトリの2つのコピーをチェックアウトし、DeltaWalkerなどの視覚的な差分ツールを使用してハンクを相互にコピーすることです。
最初のコピーは実際に作業するコピーであり、2番目のコピーはこの目的のためだけです。最初のセクションに大量の変更を加えたら、1つのセクションを2番目のセクションにコピー、コミット、別のセクションのコピー、コミットなどを行うことができます。
svn diff
を使用して作業状態のパッチを作成します。svn revert
を使用してファイルを元に戻します。patch
ツールを使用するか、手動で編集するなどして、コミットするパッチの部分を再適用します。diff
を実行して作業コピーとバックアップを比較し、パッチパーツが正しく適用されていることを確認します。