11 に答える
Tortoise SVN 1.8は、「コミット後に復元」機能でこれをサポートするようになりました。これにより、ファイルを編集でき、コミット後にすべての編集が元に戻されます
ドキュメントごと:
特定の問題に関連するファイルの部分のみをコミットするには:
- コミットダイアログでファイルを右クリックし、「コミット後に復元」を選択します
- TortoiseMerge などでファイルを編集します。まだコミットしたくない変更を元に戻します。
- ファイルを保存します
- ファイルをコミットする
TortoiseSVNを使用してこれを行いました。
組み込みのマージ ユーティリティを使用すると、リポジトリ バージョンと作業コピーの差分を表示できます。
diff ユーティリティのバックアップ作成機能を使用する
- すべての変更をコミットするかのように、ファイルをコミットします。
- コミット ウィンドウで、ファイルをダブルクリックして差分を表示します。
- 差分設定で、元のファイルをバックアップするオプションをクリックします。
- 不要な変更を右クリックし、 select use other text blockを使用します。
- 差分を 1 回だけ保存します。バックアップは保存するたびに上書きされます。これが、一度だけ保存したい理由です。
- 変更をコミットします。
- 作成された .bak ファイルでオリジナルを上書きします (オリジナルの変更がすべて含まれます)。
- ファイルをコミットします。
これで、2 つの個別のコミットを使用して、すべての変更がコミットされたはずです。
git-svn を使用すると、リモート SVN リポジトリのローカル GIT リポジトリを作成し、完全な GIT 機能セット (部分的なコミットを含む) を使用して操作し、それをすべて SVN リポジトリにプッシュすることができます。
を使用してから、ファイルをにsvn diff > out.patch
コピーしてみてください。out.patch
out.patch.add
out.patch.modify
有効なパッチファイルがある場合にのみ、を使用して元のファイルを元に戻しますsvn revert out.c
。
パッチファイルを手動で編集して、追加または変更するためのハンクのみが含まれるようにします。コマンドを使用してそれらを元のファイルに適用し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を試してみます。ただし、自分で試したことはありません。
私はこれをやっていた:
- エディター (私は vim を使用) で、ファイルを編集して、変更の 1 つだけが表示されるようにします。
- ファイルを保存します (ただし、エディターを終了しないでください)
- 変更したファイルをsvnにコミット
- 2 番目の変更セットが再表示されるまで、エディターで「元に戻す」を十分な回数押します。
- ファイルを再度保存します
- 2 番目の変更セットをコミットします。
これは単純化されたアプローチであり、一連の変更はかなり簡単に元に戻すことができると想定しています。より複雑な状況では、あきらめて、気にせずに両方の変更をコミットします。
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 マスター サーバーに同期できます。私の限られた経験でうまく機能します。
- 選択したエディターで分割するすべてのファイルを開きます
- 別のツール セットを使用して (Win では、Spike の提案 (古いバージョン) を使用)、2 番目のセットを元に戻します
- 専念
- 選択したエディターに戻り、すべてのファイルを保存します
これは、Spike の完全な提案よりも少しリスクが高くなりますが、簡単に実行できます。また、一部のエディターは、そのファイルをリロードしない限り、変更されたファイルを保存することを拒否するため、最初に別のもので試してください (すべての変更が失われます)。
差分ファイルの生成や元に戻すなどよりも簡単なオプションは、リポジトリの 2 つのコピーをチェックアウトし、DeltaWalker などの視覚的な差分ツールを使用してハンクを一方から他方にコピーすることだと思います。
最初のコピーは実際に作業するもので、2 番目のコピーはこの目的のためのものです。最初のセクションに大量の変更を加えたら、あるセクションを 2 番目のセクションにコピーし、コミットし、別のセクションをコピーし、コミットすることができます。