2012-04-05
subversionリポジトリからの変換
Twitterでこんなことをつぶやいたら入門Mercurialの著者の方にいろいろ教えてもらいました。Twitterスゴイネ!
なんとかsubversionのコミット情報を残したままmercurialにexport/import的なことできないだろうか
2012-03-29 02:37:28 via web
Twitterでのやりとり
なんとかsubversionのコミット情報を残したままmercurialにexport/import的なことできないだろうか
2012-03-29 02:37:28 via web
@sukai1989 #mercurialjp convert エクステンションでの変換では如何でしょうか? > ubversionのコミット情報を残したままmercurialにexport/import的なこと
2012-04-04 16:34:25 via web to @sukai1989
@flyingfoozy svnからのミラー+多少の修正を行っていて、一旦convertした後、mercurial側とsvn側でそれぞれ異なる更新がされた時の処理に悩んでるんですよね。現在は svn diff から hg import --no-commit しているのですが。
2012-04-04 19:19:32 via web to @flyingfoozy
@sukai1989 通常作業はMASTERとの間でpull/push。つまりsvn側での変更を「もう一人の作業者」、IMPORTをその人の作業リポジトリと見立てるわけです。 #mercurialjp
2012-04-04 22:34:13 via web to @sukai1989
@flyingfoozy 以前おそらくそれらしいことをやろうとしたのですが、最初にconvertしたものをbitbucketでホスティングしていて、その際の「IMPORT」がすでに失われていて、再度convertしてpushしようとしたら「無関係なリポジトリ」となったんですよね。
2012-04-04 22:46:56 via web to @flyingfoozy
@sukai1989 ちなみに『その際の「IMPORT」がすでに失われていて』というのは、『自前の成果も混入してしまった』という理解で合ってます? それとも『convert成果をbitbucketにupしたのでIMPORTを破棄した』ということかな? #mercurialjp
2012-04-04 23:13:37 via web to @sukai1989
@flyingfoozy 両方ですね。IMPORTを破棄してしまったあと、bitbucketに自前成果も混ざっている状況です。
2012-04-04 23:15:26 via web to @flyingfoozy
@sukai1989 今後も継続的にsvnから取り込むならば、多少面倒でもREVMAPを手動作成した方が良さそうですね (とは言っても、規模にもよりますが) #mercurialjp
2012-04-04 23:19:49 via web to @sukai1989
@flyingfoozy それほど活発なレポジトリではないのでdiff->importであんまり困らないかな、とは思っていますが、連続でコミットがあったりすると面倒ですしREVMAPも検討してみます。
2012-04-04 23:23:21 via web to @flyingfoozy
REVMAPとは
http://mercurial.selenic.com/wiki/ConvertExtension
REVMAP is a a simple text file that maps each source commit ID to the destination ID for each revision. Unless specified, it defaults to the .hg/shamap in the destination directory. This file is automatically created and updated on each commit copied, its purpose is to track which commits were already imported and which were not - and thanks to it allow to resume interrupted import and to make incremental updates. It is important to note that this REVMAP file is not copied when you a clone a repository. So you need to manually move it over if you are going to make incremental updates on a clone of the original import repository.
Subversionのリビジョン番号とMercurialのリビジョン(ハッシュ)を対応付けているファイル。最初にconvertしたときのこのファイルが失われていた、かつbitbucketのリポジトリに手前成果が入っているのでたいそう面倒な状態になっている。
結局
REVMAPを書き直してconvertし直したものを「IMPORT」、現在のbitbucketを「MASTER」とし、pull/push/mergeでやるのが良さそう。
最初のconvertリポジトリが残っていれば、REVMAP書き直し量なども少なくて済んだと思われる。
実際にやってみた
そんなに面倒じゃなかった。やったね!
テンプレートを用意するのが面倒だったので、logをsedとsortで整形して矩形コピペでREVMAPを直した後convertして全てがうまくいった。
自分が修正を加えた後は、REVMAPの最終行(以前のconvert時の最新svnリビジョン)に対応するハッシュ値を書き直す必要が出たけど、そんなに修正加えてないからなんとかなる感じ。