Merucrial レポジトリの分割・統合

ここが分かりやすかった。 convert と filemap を利用した hg リポジトリの分割と統合

基本的には hg convert でパス名を変えて変換、 という考え方でやればいいのか。

分割

リポジトリ内に a/ と b/ があって、各々分家させたいとき。

で、convertを2回やる。

hg convert --filemap a.map repo a
hg convert --filemap b.map repo b

zsh一発でやるならこうかな。repo/*/ を一括分割。

for d in repo/*(/); do
  hg convert --filemap =(echo include $d:t\nrename $d:t .) repo $d:t
done

zsh の =(...) はコマンド実行の結果を保持するファイル名 (一時ファイル)を返してくれる。もちろん終わったら 一時ファイルは消してくれる。

統合

これでいいはずなんだが、うまくいかん。

for d in repo-{a,b,c}; do
  hg convert --filemap =(echo rename . $a) $a new-repo
done

あー、hg glog したらわかった、ログが分断されちゃって、 2個目以降を hg convert で接ぎ木しても、以前のファイルがなかったことにさ れて上書きされちゃうのか。なら、n個目(n>1)を convertしたら、前回convertした先端の位置からmergeすればいいんだな。 つまりこういうこと。

for d in repo-{a,b,c}; do
  hg convert --filemap =(echo rename . $a) $a new-repo
  (cd new-repo; hg merge tip && hg ci -m merged; hg up -C)
done

はいできた。…のかな。途中で

abort: unknown revision 'b79b888eceac018d281bb2b7aa0a4482503ababc'!

とか出てるんだけども。ぱっと見、全ファイルは見えてるっぽい。

まとめ

以前svnから、hgに乗り換えるときにリポジトリを作る単位をどうしようか 悩んだものだった。というのは、svnだとあるリポジトリのサブディレクトリだ けでチェックアウトとかできるけど、hgはできない。それがものすごく あとあと不便なんちゃうか、とそのときは思った。最終的には hgの流儀ならそれは全く問題ないことが分かるのだが、最初のうちは リポジトリを作る粒度に迷いがあった。でも、分割や統合ができるなら 全然問題なし。

そういえばちょっと前に、別のリポジトリにあるサブディレクトリを コピーしたいときに、hg cp でできなくて、普通に gcp -a してしもた。 hg convert でやればよかった。