4 に答える
考えられる理由の 1 つは、変更セットの一部を忘れる可能性があることです。
チェックアウトしたサブディレクトリの外部にあるカバー ファイルをマージしようとしている変更が設定されている場合、それらのファイルをマージするのを忘れる可能性が常にあります。
たとえば、トランクに次のようなコミットがある場合:
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines
Changed paths:
M /trunk/subdir1/main.c
M /trunk/subdir2/main.c
Change some stuff
次に、ブランチ「安定」から subdir1 をチェックアウトすると、次のように変更セット r5 をマージできます。
$ svn co http://example.com/svn/branches/stable/subdir1
$ cd subdir1
$ svn merge -c 5 http://example.com/svn/trunk/subdir1 .
--- Merging r5 into '.':
U main.c
$ svn ci -m"Merged r5 from trunk"
しかし、これはリビジョン 5 の半分しかマージしません。さらに悪いことに、戻ってログを見ると、次のように表示されます。
$ svn log -g http://example.com/svn/
...
------------------------------------------------------------------------
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines
Changed paths:
M /trunk/subdir1/main.c
M /trunk/subdir2/main.c
Merged via: r6
Change some stuff
したがって、実際にはコミットの一部しかマージしていないのに、コミット全体をマージしたように見えます。もちろん、r6 は、安定版ブランチで変更されたファイルが 1 つだけであることを示しています。
------------------------------------------------------------------------
r6 | rich | 2009-04-16 22:28:16 +0200 (Thu, 16 Apr 2009) | 1 line
Changed paths:
M /branches/stable/subdir2
M /branches/stable/subdir2/main.c
Merge revision 5 from trunk
変更セットの一部のみがマージされ、残りは実行する必要があることを誰かが覚えておくか、または注意する必要があります。サブディレクトリのマージを使用しないと、この問題を回避できます。
以前のコミットのすべてをマージしたくない場合があり、上記のシナリオはまさにあなたが意図したものです。その場合は、意図を説明する適切なコミット メッセージを追加するのがおそらく最善です。
これのもう 1 つの理由は、ルートのみにマージすると、リポジトリ内のフォルダー/ファイルに設定される svn:mergeinfo プロパティの数が制限されることです。
コミットには問題はありませんが、マージでは、SVN は何がマージされ、何がマージされていないかを追跡します。
したがって、将来のマージを簡素化するために、ルートでマージすることをお勧めします (SVN によって比較されるデータセットのサイズに関して)。
1.5 より前のバージョンの Subversion では、サブディレクトリをマージすると、後でディレクトリ ツリーの残りの部分をマージするのが非常に複雑になりました。ディレクトリをマージした場合、svn はそのディレクトリで行われたすべての変更を他のブランチに単純に適用しました。すでにサブディレクトリをマージしてからメイン ディレクトリをマージしようとした場合、サブディレクトリのすべての変更は既にターゲット ブランチに含まれていました (以前にマージしたため)。Svn は、これらの変更が以前のマージによるものであることを認識していませんでした。サブディレクトリをマージしようとしたときに「途中で」何かがあり、多くの競合が発生したことがわかっただけです。
これを回避するには、以前にマージしたことがないディレクトリのみをマージするように注意する必要があり、プロセス全体がはるかに複雑になります。どのサブディレクトリのどのリビジョンを既にマージしたかを正確に記憶し、残りのディレクトリ/リビジョンの残りの変更のみを適用する必要がありました。これは混乱を招く可能性があります。常にブランチ全体をマージすることで、これがはるかに簡単になりました。Subversion の現在のバージョンは、以前のマージを内部的に追跡しているため、これらの問題を回避できます。
サブディレクトリのコミットは問題ありません。svn の場合、これはリポジトリの通常のグローバル リビジョンです。そのリビジョンでは、1 つのサブディレクトリにのみ変更がありますが、svn の場合、他のコミットと同様に、リポジトリ全体の新しいバージョンのままです。