3

2 人の開発者がそれぞれトランクからフィーチャー ブランチを作成する場合、トランクからだけでなくフィーチャー ブランチ間でも "同期マージ" を行っても問題なく、各フィーチャー ブランチをトランクに再統合できますか?

「同期マージ」とは、「svn merge ^/Project1/trunk」および「svn merge ^/Project1/branches/other-feature-branch」という形式のコマンドを意味し、svn:mergeinfo プロパティは何が行われたかを追跡します。すでに各場所からマージされています。

私が尋ねる理由は、ブランチへの同じリビジョンで再マージすると競合の問題が発生することを示唆する多くの場所でドキュメントを読んだことです (ただし、なぜこれが当てはまるのかが説明されている場所はどこにもありません) . その場合、上記のシナリオは問題になるはずです。なぜなら、各機能ブランチはトランクと同期するだけでなく、他の機能ブランチとも同期するためです。したがって、トランクで行われた変更は、トランクと直接同期するだけでなく、トランクと同期するときにも受信されます。もう一方の機能ブランチ (同じトランクの変更を既に取得している可能性があります)。

ただし、私が行ったテストでは、これは完全にうまく機能しているように見えますが、これをチームのワークフローとして推奨する前に、専門家に安心してもらいたいと思います.

@nosid: この編集で nosid に返信します。これは、SO のばかげた文字数制限により 4 文のコメントができないためです。このツイッターは何ですか?

ドキュメントを読みました。問題は、一度に 1 つの不安定化機能のみが処理され、不安定化作業が機能ブランチで実行され、他のすべての作業がトランクで実行されるという非常に単純なシナリオを説明していることです。そのシナリオでは、フィーチャー ブランチをトランクと同期させることは簡単です。

しかし、より現実的なシナリオでは、製品は非常に簡単にいくつかの主要な不安定化作業を一度に行うことができます。では、それらの作業をオンデマンドでトランクや相互に同期できるようにしながら、重大な変更を強制することなく同期を維持するためのプロセスは何でしょうか?

4

3 に答える 3

4

これは方法ではありません。機能ブランチは Subversion で使用する必要があります。簡単な例を使ったテストは、このアプローチが後で問題を引き起こすことを示しています。次の手順を試してください。

  • 新しいリポジトリを作成します。
  • 初期構造 (トランク、ブランチ、タグ) を作成してコミットします。
  • svn cp -m 'new branch' ^/trunk ^/branches/a(空の) トランクの 2 つの新しいブランチを作成し、対応するコマンド for を使用してコミットし^/branches/bます。
  • branch に新しいファイルを追加してコミットしますb
  • bブランチからブランチへの変更を でマージしaますsvn merge ^/branches/b。トランクに変更を加えていないため、マージするものはありません。
  • aでトランクのブランチを再統合してコミットしsvn merge --reintegrate ^/branches/aます。
  • トランクからブランチへの変更を でマージしbますsvn merge ^/trunk
  • ここで、以前に追加したファイルにツリーの競合が表示されます。

Subversion のドキュメントでは、機能ブランチの推奨される使用方法について詳しく説明されています。次のリンクを参照してください: Feature Branches。通常、フィーチャー ブランチはトランクから作成されます。機能ブランチで独自の変更を行い、トランクからの変更を継続的に機能ブランチにマージします ( を使用svn merge ^/trunk)。そして、作業が終了したらすぐに、( を使用してsvn merge --reintegrate ^/branches/name) ブランチをトランクに再統合します。再統合後、機能ブランチは廃止されるため、使用しないでください。

于 2012-04-04T19:21:08.023 に答える
0

両方のフィーチャー ブランチを相互に同期する場合、2 つある意味は何ですか?

それらは本質的に同じになります。

于 2012-04-04T16:30:35.117 に答える
0

これがOPの質問に対する私の見解です。質問に対する答えを決定するために他の情報源で提案されているテスト手順といくつかの類似点があることに気付くかもしれませんが、私は別の結論に達します.

これが私の再現スクリプトです:

#----------------------------------------------------------------------
# Test whether merging between feature branches in SVN results in
# tree conflicts, as claimed elsewhere:
#   http://stackoverflow.com/questions/10015249
#----------------------------------------------------------------------
export REPO=file:///tmp/merge-test/repo

#----------------------------------------------------------------------
# Create a new repository.
#----------------------------------------------------------------------
echo Creating a new repository ...
cd /tmp
rm -rf merge-test
mkdir merge-test
cd merge-test
svnadmin create repo

#----------------------------------------------------------------------
# Create and commit the initial structure (trunk, branches, tags).
#----------------------------------------------------------------------
echo Creating initial structure ...
svn mkdir $REPO/trunk -m "Initializing trunk"
svn mkdir $REPO/branches -m "Initializing branches"
svn mkdir $REPO/tags -m "Initializing tags"

#----------------------------------------------------------------------
# Create and commit two new branches of the (empty) trunk.
#----------------------------------------------------------------------
echo Creating two new branches of the empty trunk ...
svn cp $REPO/trunk $REPO/branches/a -m "branch a"
svn cp $REPO/trunk $REPO/branches/b -m "branch b"
svn co $REPO/trunk
svn co $REPO/branches/a
svn co $REPO/branches/b

#----------------------------------------------------------------------
# Add and commit a new file on branch b.
#----------------------------------------------------------------------
echo Adding and committing a new file on branch b ...
cd b
echo testing > foo
svn add foo
svn ci -m "committing new file"

#----------------------------------------------------------------------
# Merge the changes from branch b to branch a.
#----------------------------------------------------------------------
echo Merging the changes from branch b to branch a ...
cd ../a
svn merge ^/branches/b
svn commit -m "merged b into a"

#----------------------------------------------------------------------
# Reintegrate and commit branch a on the trunk.
#----------------------------------------------------------------------
echo Reintegrating and committing branch a back to the trunk ...
cd ../trunk
svn merge --reintegrate ^/branches/a
svn ci -m "merged a back into trunk"

#----------------------------------------------------------------------
# Merge the changes from the trunk to branch b.
#----------------------------------------------------------------------
echo Merging the changes from the trunk to branch b ...
cd ../b
svn up
svn merge ^/trunk
svn ci -m "refreshing b from trunk"

#----------------------------------------------------------------------
# Look for a tree conflict on the file added earlier.
#----------------------------------------------------------------------
echo Looking for tree conflicts for the file added earlier ...
svn status

最後の (svn status) コマンドからの出力はありません。これはおそらく、ツリーの競合がないことを意味します。私が知る限り、http://svnbook.red-bean.com/には、ブランチ間のマージが問題を引き起こすことを示す明示的な声明はありません (ブランチとトランク)。クロスブランチ マージが一般的なマージよりも問題があるという証拠を誰かが持っている場合は、その証拠を調べることに非常に興味があります。それまでは、実際に本質的に危険なことは何もないことをOPにアドバイスする傾向があります.

于 2015-04-24T15:01:37.953 に答える