2008-02-24
Subversionのブランチに関するメモ
Subversionでのブランチの作成とマージの手順。ぶっちゃけブランチ慣れしてないのでメモっとく。(参考: no title)
想定する運用
次のような運用をしているプロジェクトを想定。
また、扱うブランチについて次のように想定。
- ブランチからtrunkへのマージは最後にまとめて行う。開発途中での部分マージはしない
- 分岐後のtrunkでの変更点はブランチへは取り込まない
...要するに、あまり難しいことは考えないということ。
以下、REPOS-URLはリポジトリのURLを表す。例えば https://svn.example.com/repos/myproj とか file:///repos/myproj などとなる。URLが指す先のディレクトリの実体は、svnadmin createで作成されたリポジトリそのものである。
作成
Subversionのメカニズム的には、ブランチの作成は単なるコピーの作成である。次の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の項やその周辺でも読んでください。マージ済みのリビジョン番号を覚えることに関してツールの支援はない様子ですが、がんばりましょう
- 1 http://157.109.209.5/~hayashih/cgi-bin/diary.cgi?page=1
- 1 http://d.hatena.ne.jp/diarylist?of=100&mode=rss&type=public
- 1 http://d.hatena.ne.jp/gtaka555/edit?date=20080225
- 1 http://d.hatena.ne.jp/keyword/C++
- 1 http://d.hatena.ne.jp/keyword/C++
- 1 http://d.hatena.ne.jp/keyword/SPLAY
- 1 http://d.hatena.ne.jp/keyword/svn
- 1 http://d.hatena.ne.jp/keyworddiary/C++
- 1 http://d.hatena.ne.jp/keyworddiary/C++?week=20080217
- 1 http://d.hatena.ne.jp/seacat/edit?date=20080224