Hatena::ブログ(Diary)

masakiの雑記帳

2008-02-24

Subversionのブランチに関するメモ

Subversionでのブランチの作成とマージの手順。ぶっちゃけブランチ慣れしてないのでメモっとく。(参考: no title)

想定する運用

次のような運用をしているプロジェクトを想定。

  • リポジトリは1プロジェクトに1つ
  • トップ階層のレイアウトはtrunk, branches, tagsとする。trunkは主系、branchesはブランチ置き場、tagsはタグ置き場

また、扱うブランチについて次のように想定。

  • ブランチからtrunkへのマージは最後にまとめて行う。開発途中での部分マージはしない
  • 分岐後のtrunkでの変更点はブランチへは取り込まない

...要するに、あまり難しいことは考えないということ。

以下、REPOS-URLリポジトリURLを表す。例えば https://svn.example.com/repos/myproj とか file:///repos/myproj などとなる。URLが指す先のディレクトリの実体は、svnadmin createで作成されたリポジトリそのものである。

作成

Subversionメカニズム的には、ブランチの作成は単なるコピーの作成である。次の2通りのどちらかの方法で行う。

  1. リポジトリ上で直接コピーを作成しcommitする
  2. リポジトリ全体を取り出してから手元でコピーする

前者の手順:

$ svn cp REPOS-URL/trunk REPOS-URL/branches/my-private-branch -m 'Create my-private-branch.'

後者の手順:

$ svn co REPOS-URL myproj-whole
$ cd myproj-whole
$ svn cp trunk branches/my-private-branch
$ svn ci -m 'Create my-private-branch.'

分岐の作成と同時に他にも変更したいなら後者を選ぶ。さもなければどちらでも結果は同じだが、前者は手数が少なくワーキングコピーを持つ必要もないので、前者の方法を使うのがよいだろう。ちなみに、分岐は分岐作成だけで独立したリビジョンにした方が何かと扱いやすい。

ワーキングコピーのtrunk-branch間の切り替え

trunkのワーキングコピーを特定のブランチのワーキングコピーへと切り替えたり戻したりできる。

trunkからmy-private-branchへ:

$ cd myproj  (trunkを取り出したワーキングコピーのトップディレクトリ)
$ svn sw REPOS-URL/branches/my-private-branch

my-private-branchからtrunkへ:

$ svn sw REPOS-URL/trunk

マージ

ブランチでの作業が終わり、trunkへとマージする場合の手順。

まずブランチの開始リビジョン番号を確認する。後で必要になるので。

$ svn log --stop-on-copy -v REPOS-URL/branches/my-private-branch
r64 | username | ...
...
-----------------------
r47 | username | ...
Changed paths:
   A /branches/my-private-branch (from /trunk:46)

Create my-private-branch.

上記の場合、開始リビジョン番号は47とわかる。

trunkのワーキングコピーを用意する。例えばmy-private-branchのワーキングコピーからswitchするなど。

$ cd myproj
$ svn sw REPOS-URL/trunk

ブランチ上での全差分をtrunkのワーキングコピーに適用する。開始リビジョン番号の指定を間違えないように。(もうちょっと自動でやってくれてもよさそうなものだが...)

$ svn merge -r 47:HEAD REPOS-URL/branches/my-private-branch

内容を確認したらcommit。

$ svn ci -m 'Merge my-private-branch to trunk.'

使い終わったブランチを削除する。

$ svn rm -m 'Close my-private-branch.' REPOS-URL/branches/my-private-branch

なお、trunkへのマージとブランチの削除を単一のリビジョン内で行いたいなら、全体のワーキングコピーを取り出して行う必要がある。

$ svn co REPOS-URL myproj-whole
$ cd myproj-whole
$ svn log --stop-on-copy -v branches/my-private-branch
r64 | username | ...
...
-----------------------
r47 | username | ...
...
$ svn merge -r 47:HEAD branches/my-private-branch trunk
$ svn rm branches/my-private-branch
$ svn ci -m 'Merge my-private-branch to trunk.'

その他

Q. ブランチ→trunkとtrunk→ブランチの部分マージを考慮しないのは非現実的では?

A. 公式文書(の訳)のfeature branchの項やその周辺でも読んでください。マージ済みのリビジョン番号を覚えることに関してツールの支援はない様子ですが、がんばりましょう

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/quox/20080224/p1