HgSubversionでMercurialとSubversionを連携させる

私の会社ではSubversionを使っているので、まずHgSubversionを導入してローカルのみMecurialを試してみることにしました。HgSubversionを使うと、SubversionリポジトリをcloneしてローカルではMercurialで管理し、ローカルでの変更をSubversionにpushするという使い方ができるようになります。
今回、クライアントはWindowsで、SubversionLinux(Ubuntu)で動作しています。

HgSubversionのインストール

まず、SubversionMercurial(TortoiseHg)をインストールします。すでに別のクライアントでもインスールされていれば不要です。

HgSubversionを適当な場所にcloneします。

hg clone http://bitbucket.org/durin42/hgsubversion

ホームフォルダにあるmercurial.iniにhgsubversionのパスを追加します。

[extensions]
hgsubversion = C:\hgsvn\hgsubversion

fixutf8のインストール

Windows環境でMercurialを使う場合には常識なのかもしれませんが。。hgsubversionをインストールしただけだと、私の環境では既存のSubversionリポジトリをcloneした際のメッセージと日本語のファイル名が文字化けしました。これに対応するため、Mercurialリポジトリのファイル名をShift_JIS(cp932)からUTF-8に変換してくれるhg-fixutf8というextensionをインストールします。
hgsubversionと同様にhg-fixutf8をcloneし、mercurial.iniに追加します。

hg clone http://bitbucket.org/tinyfish/hg-fixutf8/

[extensions]
fixutf8 = C:\hg-fixutf8\fixutf8.py

環境変数にHGENCODINGを追加します。

HGENCODING utf-8

bitbucketを使う場合にも日本語のファイルをそのままpushしてしまうと、Windowsのクライアント間では問題ないですが、bitbucketのWebインタフェースでチェンジセットを表示すると正しくファイル名が表示されません。hg-fixutf8を使うことで、hg/svn-windows/linuxそれぞれの組み合わせでも文字化けは解消しました。
テストではここまでで大丈夫だったのですが、既存のSubversionリポジトリをcloneしたところ、fixutf8がUnicodeDecodeErrorで落ちてしまうことがありました。コミットログに問題があるのかもしれませんが、エラーの発生しているfixutf8のwin32helper.pyの84行目を以下のように変更してエラーを無視することで、とりあえずcloneは完了しました。

changedcp, oldcp = False, GetConsoleOutputCP()
u = s.decode('utf-8', 'ignore') # 'ignore'を追加

subversionリポジトリのclone

hgsubversionを使ってsubversionリポジトリをクローンします。

hg clone svn+http://foo.example.com/svn/myproject

すべてのリビジョンを取得すると時間がかかるので、特定のリビジョン移行のみcloneする場合には--startrevオプションを付けます

hg clone --startrev 3000 svn+http://foo.example.com/svn/myproject