Developer's Blog

Mercurial の convert 拡張を用いてリポジトリの内容を一括で変換する

以前のブログ記事では Git のリポジトリから Mercurial のリポジトリへの変換に hg convert を利用していました。hg convert は入力に Mercurial リポジトリを指定することもできるので、これによってリポジトリ全体に渡る修正を一括で行うことができます。

今回はそんな convert のちょっとした利用法を簡単に紹介します。

リポジトリの階層を追加する

ディレクトリ foo にリポジトリがあるときに、このリポジトリのひとつ上の階層をつくって別フォルダ bar も管理したいとします。

こんなときは、ファイルマップに各ファイルのルートが foo になるような指定をして hg convert を実行します。

C:\src>echo rename . foo > filemap.txt

C:\src>hg convert --filemap filemap.txt foo myproj
initializing destination myproj repository
scanning source...
sorting...
converting...
(中略)

リポジトリのサイズによっては 10 分以上待たされたりしますが、このコマンド実行後に myproj 内で hg update を行えば望んだディレクトリ構成になっているはずです。

ちなみに convert を使わなくても、作成したフォルダに全ファイル移動させて addremove したり、サブリポジトリを用いることもできます。しかし、この場合とは逆にひとつのリポジトリをふたつに分ける場合には convert を使うのが最善だと思います (このときの手順については Converting from Mercurial を参照してください)。

チェンジセットのソート

hg convert のオプションを利用するとチェンジセットを日付順にソートしたり、ブランチの並びが綺麗になるようにソートすることができます。例えばブランチでソートする場合には次のようにします。

hg convert --branchsort src dest

ブランチでソートするとリボジトリサイズがコンパクトになり、日付でソートすると肥大化する傾向にあるようです。後者ではリボジトリサイズが10~20倍になる可能性もあるらしいので注意してください。ただし、手元のリポジトリで試したところ、どちらの場合でも元のリポジトリと比べて大きなサイズ変化はありませんでした。

サイズ
元のリポジトリ 356 MB
branchsort 353 MB
datesort 357 MB

使用上の注意

これ以外にもコミッタ名を一括変更できたりと色々と便利な convert 拡張ですが、注意すべきことがあります。それは変換によってほとんどの場合にチェンジセット ID が変わってしまうということです。そのため、リポジトリを他の人と共有している場合にはご注意ください。

Copyright © 2019 Fenrir Inc. All rights reserved.