ここが分かりやすかった。 convert と filemap を利用した hg リポジトリの分割と統合
基本的には hg convert でパス名を変えて変換、 という考え方でやればいいのか。
リポジトリ内に a/ と b/ があって、各々分家させたいとき。
include a rename a .
include b rename 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 でやればよかった。