MercurialとBazaarのSubversionとの連携を検討する

職場ではSubversion(以下svn)サーバーが公式のソースコードと文書管理のサーバーとなっている。
この公式svnサーバーと連携をとり、手元で利用できる分散型バージョン管理システムが欲しい。

Windowsでの利用を考えているので、Mercurial(以下hg)とBazaar(以下bzr)を候補とした。
GitはWindows対応が良くなさそうなので検討対象からはずした。

サーバーのsvnリポジトリを、ローカルのそれぞれのリポジトリへ変換することをしてみたので、ここまでの状況をまとめておく。


使用環境
========

サーバー

              • -

Windows 2003 server
Subversion 1.4x (TracLightでインストール)

ソフトウェアの開発プロジェクトを管理している。各プロジェクトでは、文書、ソースコード、ヘルプ、取扱説明書などのファイルを管理している。各プロジェクトの全体のファイルサイズは数百MB〜数十GBといろいろ。


クライアント

                      • -

CPU Pentium4 3GHz
Memory 1GB
Windows XP Pro.
Sbuversion 1.6x
TortoiseSVN 1.6x

svnTortoiseSVNを使い、hg,bzrはコマンドラインから使用する。
Tortoiseexplorerの動作速度や安定性を損なうような気がしているので、まだ完成しているとは言い難いhg,bzrのTortoise利用は考えていない。

クライアントはすべてWindowsUnix系のクライアントは無い。

検討したバージョン管理ソフト

                                                      • -

* Mercurial
ver.1.2.1の0x5c問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20090503

Merucurial.ini

[extensions]
hgext.win32text =
hgext.win32mbcs =
[encode]
** = cleverencode:
[encode]
** = cleverencode:

* hgsvn
ver.0.16の日本語ファイル名問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20080920/1221931756

* Bazaar
ver.1.13

* bzr-svn
ver.0.5.3の日本語ファイル名問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20090421


想定している使い方
==================

基本的な使い方

                          • -

公式svnサーバーへコミットするソースコードはビルド可能でスモークテスト程度は実施していることがお約束だが、まだビルドがかからないとか、まだテストしてないとかの状態のソースコードでもコミットしておきたいことがある。

svnのワーキングコピーのファイルをhgまたはbzrでも管理することで、svnサーバーへコミットしないで、手元でローカルコミットできるようにする。

より進んだ使い方

                              • -

svnリポジトリをhgまたはbzrリポジトリへ変換してローカルでバージョン管理を行う。手元では、分散型ならではの自由度の高い構成でバージョン管理を行い、適当なタイミングで手元のリポジトリからsvnサーバーへコミットをする。

hgにはhgsvn, bzrにはbzr-svnという、svnリポジトリをそれぞれのリポジトリへ変換し、svnリポジトリと連携するためのツールがあるので、これらが利用できればOK。


バージョン管理ソフトに望むこと
==============================

日本語対応

                  • -

日本語パス名、日本語コミットログが使えてほしい。ソースコードではさすがに日本語パス名は使わないが、文書やメモでは良く使う。

操作性

          • -

いろいろ面倒なことをしなくても、簡単にsvnリポジトリをそれぞれのリポジトリへ変換したり、連携したりできるとうれしい。


検討内容
========

日本語対応

                  • -

* hg

インストーラでインストールした状態では日本語は使えない。
win32mbcs extensionを手動で有効にすれば、一応日本語は使えるようにはなるが、日本語パス名に関しては以下の制限がある。コミットログの日本語使用は問題ない。

- ファイル名やフォルダ名の最後の文字が2バイト目に0x5cとなる日本語の場合は、コマンドがそのパス名を認識してくれなかったりする。

- ローマ数字や丸囲み文字などの、いわゆる機種依存文字はパス名には使えない。
(機種依存文字を積極的に使いたいというわけではなく、svnでは特に問題が起きないため、他の人が使ってしまい、その結果hgが利用できなくなったり、利用しづらくなるのが嫌ということ。)


* bzr

インストーラでインストールした状態で日本語使用可能である。0x5c文字や機種依存文字も問題ない。
ただし、すべてのコマンドで日本語が問題なく処理されるかどうかは疑問な点もある。例えば、日本語ファイル名でコンフリクトが発生した場合にエラーでコマンドが実行できないことがあった。

http://d.hatena.ne.jp/kokiya/20090421/1240331034

上記のようにhg,bzrともWindowsで動作し、日本語がある程度使えるが、svn連携extensionは残念ながらそうではない。


* hgsvn

Windowsクライアントでhgpullsvnを実行すると、日本語ログや日本語ファイル名で処理が中断してしまう。
また、hgpushsvnは安定版の0.16には無く、開発版に0.17のリポジトリには含まれているが、これもWindows上では動作しない。

(一応Windows上で動作し、日本語も扱えるように改変したものはあることはあるが…。)

* bzr-svn
Windowsバイナリインストーラを使ってbzrをインストールするとbzr-svnもインストールされる。Windows上での動作は問題なさそうだが、日本語パス名が使えないコマンドがある。


リポジトリの変換

                              • -

* hg

svnでは空のフォルダも管理対象にできるのに対して、hgはできないので、あえて空フォルダをバージョン管理しているプロジェクトに含めている場合は、リポジトリをそのまま変換することはできない。

svnリポジトリをhgリポジトリへ変換するのに改変hgsvnを使用した。
ところが、リポジトリ全体を変換しようとすると途中でメモリーエラーで止まってしまう。
比較的サイズの大きいMS Officeの文書ファイルが多数含まれているので、それが原因かと思い、せめてソースコードだけでも変換できないかとソースコードフォルダだけを指定してもやはりメモリエラー発生。

エラーが発生するチェンジセットは決まっていて、そのチェンジセットでは総量600MBくらいのzipファイルやMS Officeファイルが追加されている。特にzipファイルは100〜200MBくらいのファイルが数個追加されている。その後それらのファイルは別のフォルダへ移動されていたので最新リビジョンではソースファイルフォルダには無いのだが、このチェンジセットの変換でメモリエラーが発生するためリポジトリ変換ができない。

PCのメモリが足りないのかもしれないが、同じPCでsvnでは問題なく扱えるので、メモリ必要量が大幅に異なると連携運用は難しいことが多くなるだろう。

結局リポジトリの履歴はあきらめ、hgimportsvn -rオプションによりエラーが発生しないリビジョンからの履歴だけをhgリポジトリで管理するようにした。


* bzr

bzrではsvn同様に空のフォルダも管理対象にできる。

svnリポジトリをbzrリポジトリを変換するのに改変bzr-svnを使用した。
bzr checkoutで変換しようとするが、403 Forbiddenエラーが出て実行できない。

この問題は、Internet Explorerの接続設定でプロキシサーバーの使用をオフにすることで回避できる。

http://d.hatena.ne.jp/kokiya/20090516/1242465351

bzrでもリポジトリ全体を変換しようとすると、hgと同様にメモリーエラーで止まってしまう。
うーむ、やはりPCのメモリが足りないのか?

bzrでは、hgsvnのような変換開始リビジョンの指定機能は見つけられなかったが、

bzr branch --stacked
bzr checkout --lightweight

で特定リビジョンのコードのみ取得することができるらしい。
これらのコマンドを試してみたが、残念ながら日本語パス名でエラーとなってしまう。

http://d.hatena.ne.jp/kokiya/20090511/1242055101

bzr co --lightweightでは、日本語パス名があっても何とかワーキングコピーが取得できるようだが、ちょっと動作が変な気がする。

http://d.hatena.ne.jp/kokiya/20090516/1242492582

bzr自体は比較的日本語対応が良いが、残念ながら、bzr-svnはいろいろ日本語パス名周りを修正しないと使えなさそう。


まとめ
======

Windowsクライアントで、svnサーバーのリポジトリをhgリポジトリ, bzrリポジトリへ変換する際に以下の点が問題になる。

1. 変換時のメモリエラー
2. 日本語パス名

1に関しては、hg, bzrはsvnよりも多くのメモリを消費するため、svnで問題がなくてもhg, bzrでは問題となると考えられる。
svnリポジトリの状況と、リポジトリ変換時に必要とされるクライアントPCのメモリ量の検討が必要。その上で、元のsvnリポジトリの運用(大きなサイズのファイルはコミット禁止にするなど)の検討が必要となってくるだろう。

2に関しては、hg, bzrは日本語パス名にはかなり良く対応しているとはいえsvnのレベルには達していない。また、今回検討したリポジトリ変換に使用したツールは日本語パス名に対応していないのでパッチを当てながら使用せざるを得ない状況である。

上記問題により、svnリポジトリの変換は
hgでは、一部の変換に成功
bzrでは、変換できていない
という状況である。