Subversionで管理されているプロジェクトのソースコードからMercurialでブランチを切って、変更を追いかけながらブランチを育てて、気に入らなかったら捨てたり、採用できそうだったら変更をSubversion側にプッシュしたりしたい時の図を描いてみた。
hgsvnをインストールする。新しいバージョンのものを使った方が良いので、OSで用意されたパッケージマネージャではなく、easy_installから入れる。hgimportsvn, hgpullsvn, hgpushsvnという名前のスクリプトがコマンドラインから使えるようになる。
$ easy_install hgsvn
図に赤い線で描いた部分に相当する。ここではSubversionとの同期用リポジトリをmaster、開発用ブランチ(リポジトリ)をdevelというディレクトリで管理する。
まずインポートする。
$ hgimportsvn file:///path/to/repo/trunk master
masterは、Mercurialリポジトリであると同時に、まんまSubversionの作業コピーでもあるのだけど、.svn/などの存在は最初から無視リストとして管理してくれるので、Mercurial側からは意識しなくて良いようになっている。
最初は空っぽなのでhgpullsvnでSubversion側のチェンジセットを全て持ってくる。
$ cd master $ hgpullsvn
ここから自分用の開発を進めるためのブランチを切る。
$ cd .. $ hg clone master devel
これで準備は完了。後は青い線で描いたところが日常的な作業になる。
ここではひたすらコミットしたり、
$ hg commit
master側にSubversionの変更を同期していたら、取り込んだり、
$ hg incoming $ hg pull $ hg update
良い感じに仕上がったらmasterにプッシュを行う。
$ hg push
develからの更新を反映したり、
$ hg update
Subversion側の変更を取り込んだり、
$ hgpullsvn
両者から変更があったときは、headが複数になるのでマージする。
$ hg heads $ hg merge
極まれに衝突するので、編集してコミットする。
$ hg resolve -m file $ hg commit
気に入った成果が出来上がったら、Mercurialのチェンジセットを1つにまとめてしまうオプションでhgpushsvnを実行すると、Subversionのリビジョン番号が1つしか増えないので良い感じである。-eオプションを付けるとエディタが起動してコミットメッセージを編集できる。utf-8どうのこうので怒られるときは日本語メッセージを消してしまうと良いかも。
$ hgpushsvn -c -e
このとき、Subversionリポジトリでsvn:keywordsによる自動置換をしていると、その変更が反映されるので、masterでもすぐにコミットしてdevelに取り込んでもらう必要がある。
$ hg commit
出来がイマイチで気に入らないときは、hgpushsvnせずにmasterごと綺麗さっぱり消してしまえば、Subversionリポジトリには跡が一切残らないので、気軽にオレオレブランチできる。
$ rm -rf master
ここではSubversionリポジトリに自由なタイミングでpush, pullできる前提で書いているので、もっと厳密にSubversionメインラインとの差分管理を行いたい場合はRebaseとトピックブランチ: プログラマの思索を参考にすると良いかも。
Cacooというサービスを使って描いてみました。使い易いので皆も使おう!
最近のツッコミ
参号館 日記(ariyasacca)