Subversionのリポジトリをhgsubversionを使って運用する際のメモ

最近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

このとき、my_branchはdefaultをマージ済みであること。
図で書くとこんな感じ?