HgSubversionでMercurialとSubversionを連携させる
私の会社ではSubversionを使っているので、まずHgSubversionを導入してローカルのみMecurialを試してみることにしました。HgSubversionを使うと、SubversionのリポジトリをcloneしてローカルではMercurialで管理し、ローカルでの変更をSubversionにpushするという使い方ができるようになります。
今回、クライアントはWindowsで、SubversionはLinux(Ubuntu)で動作しています。
HgSubversionのインストール
まず、SubversionとMercurial(TortoiseHg)をインストールします。すでに別のクライアントでもインスールされていれば不要です。
HgSubversionを適当な場所にcloneします。
ホームフォルダにある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に追加します。
[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