Subversion/branching guide/ja

ブランチの作成
Subversionでのブランチは単独で編集できる"単なる"既存のディレクトリツリーのコピーです. このことによってCVSより柔軟性を持つ一方で正しくソートするためには時に少し訓練しなければなりません.

リリースブランチの例
四半期のリリースのために、brachディレクトリを作成して現在のtrunkから離れてMediaWikiの"phase3"ディレクトリをコピーします:

svn mkdir svn+ssh://svn.wikimedia.org/svnroot/mediawiki/branches/REL1_8 svn copy \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3 \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/branches/REL1_8/phase3 svn copy \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/branches/REL1_8/extensions

それから、それぞれの個々のリリースのために、ブランチの特定のバージョンを引くために参照できる他のコピーを作成します: svn copy \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/branches/REL1_8 \ svn+ssh://svn.wikimedia.org/svnroot/mediawiki/tags/REL1_8_0

SVNはCVSがするように"tags"の特定の概念を持ちません; "branches"と"tags"は単なるディレクトリ名で、内容をどのように扱うのかは規約の問題です. それ故にtagにさらなる変更をすることは実際には可能です; これはたまに便利ですが(例えば、CVSからSVNに変換したときにへまをした行末変換からファイルの乱れをクリーンナップするためなど)、通常はtagsとラベル付けされたものを変更すべきではないでしょう.

トランクの変更をブランチにマージ
作業ブランチを最新に保つため、もしくは個別の修正を素早くリリースブランチにマージするために、Subversionの"merge"コマンドを使用できます.

これは不幸にも、入力するのが苦痛である大きくて長いURLのようですが、いくつかの共通の問題は少し簡略化することが出来ます; 私はこのシェルスクリプトが手軽だと思います:

リスト 1: mw-merge
 * 1) !/bin/bash

if [ "x$2" == "x" ] then current="$1" let prev="$current - 1" else prev="$1" current="$2" fi svn merge -r$prev:$current svn+ssh://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3

ブランチの作業ディレクトリで動作させるとき、このスクリプトはトランク(一つのリビジョン番号が与えられた場合)から単独の変更もしくは最初から最後までのリビジョンからトランク上のすべての変更を作業ディレクトリにマージします.

もちろん、手作業で衝突を解決しなければならないことがあります; 一般的な手引きに関してはオンラインのSubversionドキュメントをご覧下さい.

一旦衝突が解決されると、アップデートをブランチにコミットするために'svn commit'を使用します -- 履歴を後で見るときに作業を簡略化するために、できればさらに作業をする前に行います. 何をしたのか思い出すことが出来るように(そして次に何を作業すべきかを!)、コミットのコメントに対してマージしたリビジョン番号を含んでおくことを'''強くお勧めします. '''

実際、これを追跡するためにsvnmerge.pyといったツール使う場合おそらくはベストでしょう. ツールを使用することで、とても退屈な作業と同様に、マージングの時に多くのエラーに遭遇しなくて済みます.

ブランチの変更をトランクにマージ
ワークブランチが完全でゴールデンアワーのために準備が出来ているとき、トランクにマージをしたいとします. 多くて怖い場合...テストして他の人と相談をしましょう. でもすぐにリバートされても気を悪くしないで下さい. 大きな変更は最後に受け入れられる前に修正もしくはさらなるレビューが必要になることがあります.

現在のトランクからブランチ状態の差分を最初に作成し、手作業でレビューを行い、一旦満足したら差分をトランクに適用するために標準的な'patch'コマンドを使用するというワークフローが便利だと思います.

上記のトランクからマージするスクリプトに関しては、'svn merge'を利用することもできます.