3

私の質問は、以下の手順に従ってマージする場合、「ブランチをトランクに戻す」手順の最後のステップは、ベストプラクティスのシナリオでこれを行う適切な方法ですか?

私は何年もの間svnを使用してきました。私の個人的なプロジェクトでは、私は常にトランクを再考することなく楽しくハックしており、長い間、1 行の直線的な方法でバージョン管理を行うことは完璧に近いものでした。シンプルで効率的。サードパーティのライブラリをもっと制御したい日まで、すべてが至福でした。

今日、私はトランクから直接ハックするアプローチを超えたと感じるプロジェクトに取り組んでいます。私は複数のサードパーティ ライブラリを持っており、その一部は毎週変更されており、何が入るかをより詳細に制御する必要があります。サードパーティのライブラリ バージョン間で特定の変更セットを表示し、特定のライブラリに加えた変更を追跡する機能が必要です。コードベースが非常に混乱し、経験の浅いビルドマスターで実行可能な状態に戻すのが困難になるのを何度か見てきましたが、ここで失敗する余裕はありません。

そこで、ベンダーの分岐について調べ、あちこちでいくつかの記事を読みました。私は「Subversion によるバージョン管理」という優れた本を持っていますが、私が目にする例は、そのアプローチが矛盾している場合があり、「分岐」の意味を理解したいと考えています。私はEvan Weaver によるこの投稿で与えられたアプローチに従おうとしていました。

以下に手順を示しました。私の懸念は、最後のセクション「ブランチをトランクに折りたたむ」にあります。私が過去に一緒に働いたビルドマスターは通常、ブランチチェンジセットをトランクに「マージ」したようで、ブランチが削除されたとは思いません。これは適切なアプローチですか?

ブランチの作成

1 - 現在のヘッド リビジョンに注意してください。

    svn info svn://server.com/svn/repository/trunk | grep Revision

2 - トランクのクリーンなリモート コピーをブランチ フォルダーに作成します。何か名前を付けてください。これを your_branch と呼び、HEAD_REVISION をステップ 1 でメモしたリビジョン番号に置き換えます。

svn cp svn://server.com/svn/repository/trunk \
svn://server.com/svn/repository/branches/your_branch \
-m "Branching from trunk to your_branch at HEAD_REVISION"

3 - 新しいブランチを指すようにローカル チェックアウトを切り替えます (変更は上書きされません)。

 svn switch --relocate \
 svn://server.com/svn/repository/trunk \
 svn://server.com/svn/repository/branches/your_branch

4 - ローカル チェックアウトが確実に your_branch になり、問題なく更新できることを確認します。

svn info | grep URL
svn up

5 - 必要に応じて新しい変更をコミットします。

ブランチの更新

あなたは your_branch でしばらくの間開発を行ってきました。トランクの他の人も同様です。今度は、your_branch に彼らの変更を追加する必要があります。

1 - まず、ブランチ チェックアウトを更新し、未解決の変更をコミットします。

2 - Subversion ログを検索して、変更を最後にマージしたリビジョン番号を確認します (マージしたことがない場合は、元のブランチがいつ作成されたか)。これは、マージを成功させるために重要です。

svn log --limit 500 | grep -B 3 your_branch

3 - 現在のヘッド リビジョンにも注意してください。

svn info svn://server.com/svn/repository/trunk | grep Revision

4 - トランクの最後にマージされたリビジョンとトランクのヘッド リビジョンの違いを your_branch 作業コピーにマージし、LAST_MERGED_REVISION をステップ 2 で書き留めたリビジョン番号に、HEAD_REVISION をステップ 3 で書き留めたリビジョン番号に置き換えます。

  svn merge -r LAST_MERGED_REVISION:HEAD_REVISION \
  svn://server.com/svn/repository/trunk .

5.a - 出力でエラーを探します。すべてのファイルが見つかりましたか? 削除されるべきではないものが削除されましたか? 多分あなたはそれを間違った。元に戻す必要がある場合は、svn を実行しますrevert -R

5.b - 5.a で問題がないように思われる場合は、競合を確認し、見つかった競合を解決します。

svn status | egrep '^C|^.C'

6 - マージをコミットし、COMMAND を手順 4 の正確なコマンド コンテンツに置き換えます。

svn ci -m "Merged changes from trunk to your_branch: COMMAND"       

枝を幹に折り返す

ねえ、your_branch は完了です。今度はトランクにならなければなりません。

1 - まず、前のセクション (「ブランチの更新」) のすべての手順に従って、your_branch がトランクの最近の変更と同期されるようにします。

2 - トランクを完全に削除します。

svn del svn://server.com/svn/repository/trunk

3 - your_branch を古いトランクの場所に移動します。

svn mv svn://server.com/svn/repository/branches/your_branch \
svn://server.com/svn/repository/trunk

4 - 作業コピーをトランクに再配置します。

svn switch --relocate \
svn://server.com/svn/repository/branches/your_branch \
svn://server.com/svn/repository/trunk 

終わり!

この手順に関するアドバイス、コメント、またはフィードバックをお待ちしております。

4

2 に答える 2

2

まだ行っていない場合は、こちらの分岐とマージのセクションを読むことをお勧めします。

あなたが参照した投稿はかなり古く (2007 年 8 月)、時代遅れです。Subversion 1.5 (2008 年 6 月) の時点で、マージの追跡は大幅に改善されました (ブランチを作成してマージを実行すると、Subversion はトランクから既にマージされたリビジョンを実際に追跡します)。これは、Subversion 1.6 (2009 年 3 月) でさらに改善されました。

私は特にこの提案を嫌います

2 - トランクを完全に削除する

svn デル svn://server.com/svn/repository/trunk

トランクを管理する方法として。これはせいぜいややエラーが発生しやすいようです (2 つのフィーチャー ブランチが同時にマージされるとどうなるでしょうか)。私は、投稿に対する最新のコメントの見解を共有する傾向があります。

代わりに、「再統合」マージを実行して、準備ができたらブランチからトランクにマージし直すことができます。これにより、関連する変更セットがブランチからトランクに適用されます。

于 2011-06-17T13:40:19.843 に答える
1

svn スイッチ --relocate \ svn://server.com/svn/repository/trunk \ svn://server.com/svn/repository/branches/your_branch

--relocate オプションは、別のリポジトリに切り替えることです。新しいブランチはトランクのコピーなので、切り替えます。

ただ行う:

svn switch ^/branches/your_branch

svn 情報 | grep URL svn up

ほとんどの場合、この更新は何もしません。

svn merge -r LAST_MERGED_REVISION:HEAD_REVISION \ svn://server.com/svn/repository/trunk .

ほとんどの場合、私は TortoiseSVN を使用しますが、以下のみを試してください。

 svn merge ^/trunk .

これが機能するかどうか試してください。マージ追跡については、新しい SVN は merge-info プロパティを使用するため、ほとんどの場合、何をマージするかを認識している必要があります。問題がある場合、あなたのアプローチはうまくいくはずです。

  • ^/ はリポジトリの相対 URL です。
  • svn info ^/ あなたの svn バージョンで利用できるかどうか試してください (svn フォルダにあるはずです)

ブランチを削除する部分は私を怖がらせます...

試す:

# ブランチは最新である必要があることに注意してください (ブランチの早い段階でほとんどの競合を解決してください) svn switch ^/trunk svn merge --reintegrate ^/branches/your_branch .

競合を解決する ;)

svn commit -m "reintegrated your_branch" svn delete ^/branches/your_branch

ほとんどの場合、処理方法がわからない場合は、このブランチを削除することをお勧めします (簡単ではないため、削除して新しく作成することをお勧めします)。

また、他のブランチ/トランクで変更した名前の変更/ファイルの再配置にも注意してください。これにより、ツリーの競合が発生します。他のブランチに変更がなければ自由に実行してください。

于 2011-06-17T18:03:10.370 に答える