3

ローカルのSubversion作業コピーには、トランクとコードブランチのコピーがあります。トランクに変更を加えました。これらの変更をブランチの(現在はクリーンな)ローカルコピーにコピーしたいと思います。

コードをトランクにチェックインしてsvn mergeから、ブランチに変更を取得するために使用できることはわかっていますが、最初に変更をチェックインせずにこれを行う方法はありますか?

残念ながら、トランクとブランチの間の変更を取り巻くコードに変更があるため、diff/patchは機能しません。svn merge私はそれらに対処できることを知っていますが、私が言うように、私はむしろ最初に私の変更をチェックする必要はありません。

例を追加するために編集:

トランクには、次を含むファイルがあります。

File in trunk:                       File in branch:
apple                                apple
orange                               banana
pear                                 pear

トランクでは、作業コピーのトランクファイルにdragon fruit以下を追加します。pearその変更を確認し、mergeを使用してブランチにコピーした場合、Subversionはファイルのブランチバージョンにdragon fruit以下を正しく追加します。pear

svn diffトランクファイルの私のコピーでは、次のようなものが生成されます。

Index: fruit.txt
===================================================================
--- fruit.txt  (revision 56)
+++ fruit.txt  (working copy)
@@ -1,3 +1,4 @@
 apple
 orange
 pear
+dragon fruit

パッチを使用すると、変更されていないテキストの違いに気付くため、明らかに機能しません。

何もチェックインせずに私がしたいのは、両方のファイルのdragon fruit後にリストされていることですが、どちらのファイルでも/の違いが変更されていないことです。pearorangebanana

4

4 に答える 4

4

svn switch作業コピーのコピーをブランチにコピーできます。

ただし、最も安全な方法は、変更をプライベートブランチにコミットし、svn merge必要な場所でそれらをマージするために使用することです。

于 2009-12-09T11:52:19.170 に答える
1

移植したい特定の変更とそうでない特定の変更があるという問題も解決switchもしません(変更が同じファイルのセット内にあると仮定します。異なるファイルにある場合は、関連するファイルのみを移植できます)ファイル)。mergediff

いずれの場合も、ブランチに適用するチェンジセットのみを区別し、それを適用してから、トランクへの追加の変更を続行する方法が必要になります。

WinMerge、TortoiseMerge、または同様のツールを使用して、ブランチとトランクの間で関連するファイルを比較し、それをステップスルーして、必要な変更のみを適用します。

于 2009-12-09T16:30:37.780 に答える
1

パッチを適用できない理由svn diffは、トランク内のコードのバージョンがトランク内の変更よりも新しい必要があるためです。これは、機能に取り組んでトランクで作業を継続するために分岐した可能性がある一般的なシナリオです。

この問題を解決するには、ブランチをトランクで最新の状態にしてから、差分を適用する必要があります。

svn merge svn://path/to/trunk /path/to/working-copy

これにより、ブランチがトランクで最新の状態になります。競合がある場合は、それらを解決する必要があります。

今、

svn commit /path/to/working-copy -m "Merged latest trunk changes into the branch"

それから、

svn diff /path/to/trunk > my-new-code.patch

そして最後に、

cd /path/to/working-copy patch -p0 -i /path/to/my-new-code.patch

これで、ブランチの作業コピーがトランクで最新になり、さらに新しい変更が加えられます...トランクのリポジトリバージョンは変更されません。

編集:元の質問を編集して詳細情報を提供した後、次のことをお勧めします。

これは、たとえば、ブランチがトランクのリビジョン30に基づいて作成され、インポートする変更がトランクのリビジョン56にあることを前提としています。

  1. svn up /path/to/branch-WC
  2. svn up /path/to/trunk-WC -r 30
  3. svn merge svn://path/to/trunk -r 55:56 /path/to/trunk-WC
  4. cd /path/to/trunk-WC
  5. svn diff /path/to/trunk-WC > /path/to/branch-WC/mychange.patch
  6. cd /path/to/branch-WC
  7. patch -p0 -i mychange.patch

ここで行っているのは、ブランチが作成された場所と同じリビジョンにトランクを更新することです。このように、作成するパッチはすべて同じリビジョンに基づいています。

次に、リビジョン55:56をマージすることにより、「ドラゴンフルーツ」の差分のみを要求します。オレンジ/バナナの変更はリビジョン55:56の間に行われなかったため、その差分はパッチファイルに入力されません。

リビジョン56の変更が以前のチェンジセットに依存している場合は、競合を解決するか、さらにいくつかのリビジョンをマージする必要があります(このリビジョン30のトランクはそれらを認識しないため)が、まさに必要なものである必要があります。

于 2009-12-09T16:56:11.310 に答える
1

この質問は古いですが、それでも私は正しい解決策を投稿しています

http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion

要するにトランクで

svn diff > ~/trunk.diff

そしてブランチルートで

patch -p0 -i ~/trunk.diff
于 2012-02-20T12:48:00.027 に答える