最近Subversionが中央リポジトリになっている環境で作業することがあって、手元でMercurialを使いたい場合にどうやってくかという話。
hgsubversion を使う。
durin42 / hgsubversion — Bitbucket
hgsubversionをubuntuで使えるようにする
Ubuntuのバージョンは10.04。ビルドするためにいくつかパッケージをインストールしておく。
$ sudo aptitude install build-essential subversion apache2-dev libsvn-dev
easy_installでインストールする。
$ sudo easy_installl subvertpy hgsubversion
hgrcで拡張を有効にしてから、バージョンを確認する。
$ hg version --svn
hgsubversionのバージョンなどが表示されていればOK。
初回の同期
初回はSubversionリポジトリからcloneする。履歴が多いとかなり時間がかかるので注意する。
$ hg clone https://example.com/svnrepo/
Subversion側の変更内容は基本的にdefaultブランチに入る。
pull/push
hg pullを行うとdefaultブランチにSubversion側の変更内容を取り込む。
hg pushを行うとdefaultブランチの内容をSubversion側に反映する。
ブランチ
pullとpushの際にはdefaultブランチを使うことになるが、このブランチに直接マージしないように気をつける。
マージ状態になると、Subversion側にpushできなくなる。
Mercurialのブランチを自由に作ってもSubversion側に反映されないので問題はない。
作業中に他の人のコミットがああるなら、基本的にdefaultブランチへの直接コミットは行わず、作業ブランチを使うほうが簡単。
マージ
Subversion側の変更の取り込み
作業中にSubversion側に変更をコミットされた場合。単純にpullしてきてdefaultブランチの変更をマージするだけ。
$ hg pull $ hg up my_branch $ hg merge default
Subversion側への変更の反映
これが一番大事なところ。
defaultブランチへマージする際にはrevertを使って変更分を上書き適用することになる。
マージ手順に関してはTortoiseHGでの説明になるが id:monjudoh の記事がまとまっていていい感じ。
TortoiseHG+hgsubversionでのsvnのbranchのmerge - 文殊堂
コマンドでやる場合はこんな感じになる。
$ hg update default $ hg revert --rev=my_branch --all $ hg commit $ hg push # Subversion側へpush