Subversionでの部分的なコミット


104

ケースを考えると私が作っ二つの独立した変化では1例:ファイルを。新しいメソッドを追加し、別のメソッドを変更しました。

多くの場合、両方の変更を1つのコミットとしてコミットするのではなく、2つの独立したコミットとしてコミットします。

gitリポジトリでは、対話モードgit-add(1)を使用して、ハンクを小さいものに分割します。

 git add --patch

Subversionでこれを行う最も簡単な方法は何ですか?(たぶんEclipseプラグインを使用しているかもしれません)

アップデート:
Gitリポジトリについてザ・シング、ライアンはそれを呼び出す:「もつれた作業コピーの問題。」


コマンドラインで解決策を具体的に探していましたか?以下の応答の多くはTortoiseSVNの「コミット後の復元」に言及しています。これはTortoiseのみの機能で、GUIベースとWindowsベースです。
florisla 2017年

回答:


35

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

git-svn(1)


25
このソリューションには特別な皮肉があります。
tuxayo 2017

65

Tortoise SVN 1.8 は、「コミット後に復元」機能でこれをサポートしています。これにより、ファイルに編集を加えることができ、すべての編集はコミット後に取り消されます。

ドキュメントごと:

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

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

これはどのように機能するのでしょうか。SVN 1.8リリースノートを確認しましたが、「コミット後の復元」がどの機能に基づいているのかわかりません。
DavidS 2017

3
@DavidSこれはSVNの機能ではありません。TortoiseSVNの機能です。
florisla 2017年

参考までに、SVN 1.8は2018年4月からEOLとなり、1.10がリリースされます
グレッグK

:我々はまた、ここではドキュメントでそれを見つけることができますtortoisesvn.net/docs/release/TortoiseSVN_en/...
ギヨームHusta

42

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

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

diffユーティリティのバックアップ作成機能を使用する

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

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


1
これをどのように正確に行いましたか?そのテクニックを学ぶことに興味があります。
Lasse V. Karlsen、

これがコミット後に自動的に.bakファイルで上書きされれば、それはとても素晴らしいことです。
BCS、

手順3が見つかりませんでした:Tortoise SVN 1.8.1を使用したバックアップオプション
sudhAnsu63

4
気にしないで。1.8の対応するリンクが見つかりました tortoisesvn.net/tsvn_1.8_releasenotes.html 1つの特定の問題に関連するファイルの部分のみをコミットするには、コミットダイアログでファイルを右クリックし、[コミット後に復元]を選択してファイルを編集しますたとえばTortoiseMerge:コミットしたくない変更を元に戻し、ファイルを保存しますファイルをコミットします
sudhAnsu63

悲しいことに、これはTortoiseバージョン1.8.5では利用できないようであり、「コミット後に復元」することもできません。
kajaco 14年

24

を使用してsvn diff > out.patchout.patchファイルをにコピーしてout.patch.addout.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必ずすべてをテストして、問題がないことを確認してください。


11

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


8

私は以前これをしていました:

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

これは、一連の変更がかなり簡単に元に戻すことができることを前提とする単純化したアプローチです。もっと複雑な状況では、心配せずに両方の変更をあきらめてコミットします。

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


4

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


9
Re:「なぜそんなに長く待つの?」終日大規模なリファクタリングを行うと、上司は昼食の直前に少し修正(この場合はバグ)を行います。
BCS


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

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


0

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

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


0
  1. 関連するすべての変更されたファイルをバックアップコピーにコピーします。
  2. を使用して、動作状態のパッチを作成しますsvn diff
  3. を使用してファイルを元に戻しますsvn revert
  4. patchツールを使用するか、手動で編集するなどして、コミットするパッチの部分を再適用します。
  5. diff後で実行して、作業コピーとバックアップを比較して、パッチパーツが正しく適用されたことを確認します。
  6. ビルドしてテストします。
  7. コミット。
  8. バックアップコピーをリポジトリのチェックアウトにコピーします。
  9. 完了するまで、2。(1.ではなく)で繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.