web-dev-qa-db-ja.com

Subversionを使用した部分コミット

私が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」

98

Git-svnを使用すると、リモートSVNリポジトリのローカルGITリポジトリを作成し、完全なGIT機能セット(部分コミットを含む)を使用して操作し、それをすべてSVNリポジトリにプッシュバックできます。

git-svn(1)

32
jkramer

Tortoise SVN 1.8 現在サポート これは「コミット後に復元」機能です。これにより、ファイルの編集が可能になり、コミット後にすべての編集が取り消されます。

ドキュメントごと:

特定の1つの問題に関連するファイルの部分のみをコミットするには:

  1. コミットダイアログで、ファイルを右クリックし、「コミット後に復元」を選択します
  2. ファイルを編集しますTortoiseMerge:まだコミットしたくない変更を元に戻します
  3. ファイルを保存する
  4. ファイルをコミットする
59
Casebash

TortoiseSVN を使用してこれを実行しました。

組み込みのマージユーティリティを使用すると、リポジトリバージョンと作業コピーの差分を表示できます。

Diffユーティリティのcreate backup関数を使用します

  1. すべての変更をコミットするかのように、ファイルをコミットします。
  2. コミットウィンドウで、ファイルをダブルクリックして差分を表示します。
  3. 差分設定で、元のファイルをバックアップするオプションをクリックします。
  4. 不要な変更を右クリックし、選択他のテキストブロックを使用を使用します。
  5. Diffを1回だけ保存します。バックアップは保存するたびに上書きされます。これが、一度だけ保存したい理由です。
  6. 変更をコミットします。
  7. 作成した.bakファイルで元のファイルを上書きします(元のすべての変更が含まれます)。
  8. ファイルをコミットします。

これで、2つの別個のコミットを使用して、すべての変更をコミットする必要があります。

41
Spike

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をテストして、すべてが正常であることを確認してください。

24
Chris

これは、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 を試してみます。しかし、自分で試したことはありません。

10
parvus

私はこれを行うために使用します:

  • エディター(vimを使用)で、変更を1つだけ表示するようにファイルを編集します
  • ファイルを保存します(ただし、エディターを終了しないでください)
  • 変更されたファイルをsvnにコミットします
  • エディターで「元に戻す」を押すと、変更の2番目のセットが再表示されます
  • ファイルをもう一度保存します
  • 変更の2番目のセットをコミットします。

これは、1セットの変更を元に戻すのがかなり簡単であると仮定する単純なアプローチです。より複雑な状況では、心配せずに両方の変更をあきらめてコミットします。

Gitを使用するようになったので、これはもう二度とする必要がないことを願っています!

7
Greg Hewgill

ローカル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マスターサーバーに同期できます。私の限られた経験で素晴らしい作品。

4
Aeon

Visual StudioのVisualSVN を試してください。 最新6.1リリース は、QuickCommit機能を導入します。 Visual Studioエディターの新しいCommit this BlockおよびCommit Selectionコンテキストメニューコマンドを使用して、ファイル内の選択した変更を部分的にコミットできます。 。

enter image description here

4
bahrep
  1. 選択したエディターで分割するすべてのファイルを開きます
  2. 別のツールセットを使用して(Winでは、Spikeの提案(古いバージョン)を使用)、2番目のセットをバックアウトします。
  3. コミット
  4. 選択のエディターに戻り、すべてのファイルを保存します

Spikeの完全な提案よりも少し危険ですが、より簡単にすることができます。また、一部のエディターは、そのファイルをリロードしない限り(すべての変更を失う)、その下から変更されたファイルの保存を拒否するため、最初に他の何かで試してください

2
BCS

差分ファイルの生成や復帰などよりも簡単なオプションは、リポジトリの2つのコピーをチェックアウトし、DeltaWalkerなどの視覚的な差分ツールを使用してハンクを相互にコピーすることです。

最初のコピーは実際に作業するコピーであり、2番目のコピーはこの目的のためだけです。最初のセクションに大量の変更を加えたら、1つのセクションを2番目のセクションにコピー、コミット、別のセクションのコピー、コミットなどを行うことができます。

0
Ian Dunn
  1. 変更されたすべてのファイルをバックアップコピーにコピーします。
  2. svn diffを使用して作業状態のパッチを作成します。
  3. svn revertを使用してファイルを元に戻します。
  4. patchツールを使用するか、手動で編集するなどして、コミットするパッチの部分を再適用します。
  5. その後、diffを実行して作業コピーとバックアップを比較し、パッチパーツが正しく適用されていることを確認します。
  6. ビルドとテスト。
  7. コミット。
  8. バックアップコピーをリポジトリのチェックアウトにコピーします。
  9. 完了するまで、2で繰り返します(1ではなく!)。
0
michaeljt