分散バージョン管理の続き。
実際に試してみることにする。
まず、svk。VCPを使ったCVSとの同期はpserverにしか対応していないような気がするため、断念。 Perlモジュールを大量にインストールする必要があるのがやや面倒という 理由もあるが、使えるのなら躊躇しない。もしかして最新版ではできるとかいう話なら、 喜んで乗るのだが。
次に、gitを試す。gitにはgit-cvsimportとgit-cvsexportcommitというコマンドがあり、 CVSとのコミットのやりとりができるそうだ。 で、git-cvsimportでRuby HEADを取り込んでみたが、 ゼロからインポートするのに7時間かかった。 ちょっと遅すぎ。マニュアルにはgit-cvsimportはインクリメンタルにインポートできる と書いてあるのだが、その実態は全体のrlogを取り、 再コミットすれば各コミットのハッシュ値が同じだから二重登録はされない、 というもののようだ。とにかくインポートに時間がかかる。 個人的なニーズとしてはオンラインになるごとにインポート・エクスポートをしたいわけ だから、これではあまり使えなさそう。
この時点ではgit-cvsexportcommitまでは試せず。
それから、tailorを試す。 tailorは各種バージョン管理システム間でデータのやりとりを行うツール。 全部はとてもできないので試したのは
まず、どれにも共通していえるのはRubyのCVSリポジトリは大きすぎるということ。 1.8ブランチのような小さなものでは問題なくCVSからインポートできたけど、 HEADのような大きなものではどれもエラーになってしまう。 仕方がないので日付を指定して最近の履歴だけに限定すれば取り込める。
tailorの問題は、エクスポートである。 「CVSからのインポート」は誰もがやりたいことだろうから、 わりとすんなり(それでも規模の点で面倒だったが)進んだが、 「CVSへのエクスポート」はどれもうまくいかない。
svnは謎のエラーが発生するし(日付を指定するとtailorが内部的に呼び出すcvsのコマンドライン引数が間違っててチェックインできない)、 gitに至ってはtailor内部のPythonメソッド呼び出しの引数の数から間違っていて、 このコードは絶対にまともに動いたことが一度もないのは明らかという感じ。 とりあえずあまりにも明白なバグは修正したが、それでもまだまだ動かない。 バグ満載の気配。
まだ、monotoneは試していないんだけど、 CVSからのインポートはサポートしていても、エクスポートはサポートしていないから tailorのmonotone対応がうまく動いてくれるかどうか、ってところだが、 svn, gitの対応具合を見ると結構怪しそう。
あと、darcsか。tailorはもともとdarcsのツールだそうだから、 実は期待できるのかも。後で試してみるか。
ところで、tailorのgit対応が出したエラーを見てて気付いたんだけど、 Pythonって
>>> class Foo: ... def foo(self, a, b): ... print a, b ... >>> foo=Foo() >>> foo.foo(1,2,3) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: foo() takes exactly 3 arguments (4 given)
ってエラーを出すのね。3つしか引数渡してないのになんで4 givenなんだ とか思っちゃった。ちょっと考えればレシーバが引数として渡されるから ひとつ増えるのは分かるんだけど、Rubyに慣れた身としてはだいぶ驚いた。