質問
...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy
私は、このアプローチは大規模な開発では非常に非現実的であると考えています。理由はいくつかありますが、主に再統合のステップに関連しています。
- SVN v1.5 以降、マージはリビジョンごとに行われます。マージする領域を厳選すると、トランクとブランチの競合を 2 回解決する必要があります (1 回目はトランクのリビジョンを FB にマージするとき、もう 1 回はマージバックするときに)。
- リポジトリのサイズ:トランクの変更は大規模なコード ベースでは重要になる可能性があり、別のトランクから差分ファイル (SVN コピーとは異なり) をコピーすると、重大なオーバーヘッドが発生する可能性があります。
代わりに、「再分岐」と呼ばれるものを実行します。この場合、トランクの大幅な変更が必要になると、現在のトランクから新しいフィーチャー ブランチが開かれ、マージは常に下方向に行われます (フィーチャー ブランチ -> トランク -> 安定ブランチ)。これは SVN 書籍のガイドラインに従っていないため、開発者はこれが余計な苦痛であると考えています。
この状況にどう対処しますか?
解決 2
調査後:
ビジョンマップでのブレーンストーミングセッションの後、Artyom、SVNの本ケースを開くなどのF2Fディスカッションなど - これはできないようです。機能ブランチは、まったく機能するコピーとはまったく異なります。上記のように、それを更新する唯一の作業方法は、新しいブランチを再作成することです。
他のヒント
SVN v1.5から、マージはRevごとに行われます。統合されるエリアをチェリーピックすると、トランクブランチの競合を解決することができます 2回 (1つはトランクリビジョンをFBにマージするとき、そして再びマージしたときにもう一度)
それからあなたは何か間違ったことをしています!
どれどれ:
trunk fb
---------\
r1-10 |
r11-20 |
r20-30 |
通常、11-20で変更を行いたい場合は、ベストプラクティスは1-20をFBにマージし、そこにすべてを取得することです。
次に、FBが完了したら、20-30をマージしてから コピー fbからトランクへ(マージなし!)。
R11:20、OKのみをマージすることにした場合、最後にR1:10とR20:30をマージする必要があります。 コピー fbからトランク。
変更を2回マージする方法はありません!
私はあなたがおそらくフォローすると思います:
copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG
11:20を2回統合するため、これはできません。常に一方向のみでコードをマージする必要があります。
正しい方法:
copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk
編集
したがって、正しいステップは次のとおりです。
トランクからフィーチャーブランチ(FB)を作成します(トランクをコピーして、SVNコピー付きのブランチをフィーチャーします)
FB_0=trunk_0
FBで作業します。
FB_1=FB_0 + change_a
トランクからFBへの今後のすべての変更をマージします。
trunk_1=trunk_0 + tr_change_a; FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
FBで作業します
FB_3 = FB_2 + change_b
今後のすべてをマージします マージド変更 トランクからFBまで。
trunk_2=trunk_1 + tr_change_n; FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
この時点で、で構成される機能ブランチがあります 全て 新機能と全て トランクの変化。したがって、2つのブランチ間の違いをコピーするだけです。
trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
トランクに必要なすべての変更があるため、FBが削除されました。
最後のステップは次のように実行されます。
svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev . svn ci
または、通常の言語では、トランクと枝の違いを取り、それらをトランクに置き、それらを同等にします。
このパターンはで説明されています http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature
これがあなたのためにうまくいかないなら、私は質問を理解していません。
編集2: SVN-1.5の場合
SVN-1.5を使用する場合、よりシンプルにマージできます。
機能ブランチで作業するときは、トランクから時々変更をマージするだけです。
$ svn merge /path/to/trunk
Solve conflicts
$ svn ci
トランクのすべての変更とFBを並べます。 FBの終わりに、この手順をもう一度実行して、すべてが最新であることを確認します。あなたはトランクに行き、走ります
$ svn merge --reintegrate /path/to/fb
$ svn ci
最後の1つでは、示されているように作業している場合、競合はないはずです。
私たちは小さな会社なので、私たちのソリューションがあなたの状況に適用されるかどうかはわかりません。私たちがしていることは、トランクから安定した枝に融合する回転式の革新です。 2つの異なる方法でそれを行うことができます: - 本当に必要な修正、トランクにコミットした直後に合併 - 危険な修正/変更。変更がトランクで証明されるまで数日待ちます。
この連続合併により、大量の対立を避けます。
私の2セント。
悲しいことに、ここで述べたものはすべてハッキングと考えられる可能性があります。ブランチ上のトランクから更新すると、それをトランクに戻すときに非常に深刻な問題が発生する可能性があり、すべての競合の中で最悪のツリー競合が発生する可能性があります。これは、ディレクトリが第一級住民として扱われないためです。最良のアプローチは、標準のSVNクライアントとしてSVN拡張機能を使用してMercurialを使用することです。これにより、Mercurial のフォルダー処理機能を利用しながら、SVN を使い続けることができます。
次に、wworkstation 側で、SVN の単一のアプローチに比べて、さまざまな状況に適合する一連の機能を提供するさまざまなアプローチを使用できます。共有トランクに影響を与えることなく、定期的なパッチ適用、パッチキュー、トランクのローカルコピーからの更新、およびその他のさまざまなアプローチを使用できます。
このアプローチは、SVN のあらゆる欠点を回避します。私も同様の状況のため、このアプローチに切り替える必要がありました。このアプローチをすぐに使用しない場合でも、少なくともできるだけ早く試してみる必要があります。
ここで@artyomのcudgelsを取り上げなければならないと思います。私もあなたがしなければならないならそうだと思います
トランクブランチの競合を解決します 2回
何かが間違っている。そして、@artyomsの引数/解決策は非常にしっかりしていると思います。
@artyomがより明確に書くことができた小さなことの1つは、最終的にあなたが「コピー」することだと思います fb
に trunk
使用しません svn copy
しかし svn merge
(また svn merge --reintegrate
)。これが、「コピーマージ」パターンが見つからない理由かもしれません 一般的な分岐パターン.
私はあなたが今まで何をしているのかを理解するのに苦労しているので、私は他に何を言うべきか確信が持てません。
これが私が聞いたことです:
代わりに、私たちは「再割り当て」と呼ぶものをします。この場合、トランクの変化の大幅な塊が必要な場合、現在のトランクから新しい機能ブランチが開かれます...
これで、トランクに相当する新しいブランチ(B2と呼びましょう)がありますよね?と どこ 「トランクの変更の大部分が必要です」?私はFBで仮定しますか?
...そして、マージは常に下向きです(特徴的な枝 - >トランク - >安定した枝)。
しかし、トランクからB2を作成したばかりのとき、トランクに合流するものは何もありませんよね?また、B2からFBへの変更をマージしているわけではありません(これはトランクをFBにマージするのと同じであるため)。では、「変更の重要なチャンク」はどのようにしてFBに入るのでしょうか?そして、彼らがそこにいると、なぜあなたはそれらをトランクに戻したいのですか(これはそもそも彼らがどこから来たのか)?
実際、次のリンク 「トラッキングは手動でマージ」と呼ばれるセクション および/または 「ブランチ全体を別のものと統合する」というセクション SVN 1.4ドキュメントで提供されています(SVN 1.4を使用していませんが、とにかく適用されると思います) 一般的な分岐パターン いくつかのことをクリアするのに役立つかもしれません。これらのリンクは1.5ドキュメントで「欠落」しています(おそらく新しいもののため --reintegrate
オプション merge
).
あなたは本当に同じ変更を2回統合しているように見えますが、私は本当にそうすべきではないと思います。