ある作業場(ワーキングディレクトリ)で作業をしてゐると、倉庫(リポジトリ)にいろいろファイルがたまってくることがあります。そのうち、いくつかのファイルを分離させたいと思ふことがあります。しかし新しい倉庫を作って、そこに今あるファイルを複製するだけだと、今までのそれらのファイルの履歴がごっそりなくなってしまひます。
なんとか履歴付きでファイルを抜き出して新しい倉庫を作りたい。さう云ふ方法はないのかと探してゐたところ、なんとあることが分かりました。
まづは今回の実験用に base ディレクトリに専用の倉庫を作成します。
#hg init base
そこにファイル a.txt、b.txt、c.txt を作り、倉庫に登録します。
#cd base #echo a > a.txt #echo b > b.txt #echo c > c.txt #hg add a.txt を追加登録中 b.txt を追加登録中 c.txt を追加登録中 #hg ci -m "abc" #hg log -G @ changeset: 0:6937b43f7c15 tag: tip summary: abc #echo c >> c.txt #hg ci -m "c" #hg log -G @ changeset: 1:2393f55235d4 | tag: tip | summary: c | o changeset: 0:6937b43f7c15 summary: abc #hg cat a.txt a # #hg cat b.txt b # #hg cat c.txt c c #
ここから c.txt を抜き出し、新しい倉庫を作ることを考へます。何のファイルを抜き出すのかを指定するファイルを作ります。ここでは、map.txt と云ふ名前で作ります。ややこしくなることを回避するため、このファイルは作業場には作らない方がよいでせう。
#cd .. #echo include c.txt > map.txt
map.txt には、「include c.txt」と云ふ行があります。これは見ての通り c.txt を含めると云ふ意味です。c.txt のところにはファイル名だけでなくディレクトリ名も指定できます。この include 指定があると、これで指定したファイルしか抜き出されません。また、抜き出す時にファイル名を変へることが出来ます。「rename 変換前 変換後」を入れます。これで指定するときも変換前のファイルは include で含めなくてはなりません。include が map.txt に無いとすべてのファイルが対象になります。「#」で始まる行はコメント行となり、プログラムからは無視されます。
また「exclude 名前」として除外ファイルを指定することも出来ます。
new と云ふ新たな倉庫にこれを抜き出すこと考へます。このため convert コマンドを実行します。convert は予め Mercurial に含まれてゐますが、有効化されてゐないので有効にする必要があります。設定ファイル .hgrc (Windows の場合 Mercurial.ini も) に次のやうにして有効化します。
[extensions] convert=
実行は次のやうにして、base 倉庫から new 倉庫へ、map.txt に基づいて変換を行ふやうに指示します。
#hg convert --filemap map.txt base new 変換先リポジトリ new の初期化中 変換元リポジトリの走査中... 並べ替え中... 変換中... 1 abc 0 c
結果は次のやうになります。
#cd new #hg log -G o changeset: 1:497bec05f591 | tag: tip | summary: c | o changeset: 0:7e51ef2ec45f summary: abc #hg co ファイルの更新数 1、 マージ数 0、 削除数 0、 衝突未解消数 0 #ls c.txt #cat c.txt c c #
正しく変換されたことがわかります。
別の倉庫、例へば another から 今作った new に another.txt に基づいてファイルを抜き出して new に併合すると言ったことも出来ます。ただ、どうも同じ倉庫からは持ってこれないやうです。当たり前ですが、併合した後は merge しないといけません。
#hg convert --filemap another.txt another new
なほ、いろいろ試してゐたところ、次のやうになってゐるやうに見えます。
- 現在削除されてゐるファイルは移されない
- 過去に rename されたファイルは過去のやつもまとめて移される