Convert でリポジトリを分解する

posted by Thomas G. Willis on November 16, 2009

プロジェクト(フォルダ)を多数抱えることになってしまったリポジトリがあるとしましょう。 さて、あなたはプロジェクト(フォルダ)がそれぞれ別のリポジトリになっているほうが良いと思い、 そうすることにしました。それには convert エクステンションが使えます。 チェンジセットの履歴はそのままです。

例えば、こんなレイアウトのリポジトリで:

/yourrepository
    /DatabaseFoo
    /SweetBusinessLogic
    /BaseUI
    /AnotherDamnContentManagementSystem

ある時点で、 AnotherDamnContentManagementSystem は専用のリポジトリであるべきだと気づきました。 そして、このことをずっと昔に予想できたかと思いを馳せ、 Perforce を使っていた時のようにバージョン管理ってものはやたら時間のかかる処理だと思い込み、 全てを一緒くたにしてしまったのは、あなたにとって全くもってお粗末な選択だったと感じるのです。

さぁ、あなたはラッキーでした。 convert エクステンションでこの恥ずかしい決定を取り消すことができます。 今日のランチでベンチャーキャピタリストにあなたの作品を見せる前にね。

まず、 convert エクステンションを有効にします:

[extensions]
convert =

convert コマンドには --filemap パラメーターがあり、 変換作業に含めたいものと含めたくないものを指定できます。 変換中に名前を変えることもできます。 これから行う作業で使う filemap はこのようになります:

include AnotherDamnContentManagementSystem
rename .

それから、 convert コマンドはこのようになります:

$ hg convert --filemap myfilemap bigrepo AnotherDamnContentManagementSystem-Repo

これだけです。 AnotherDamnContentManagementSystem に専用の Mercurial リポジトリができました。

リポジトリが無駄にやたらデカくなってしまい、 個々のプロジェクトにそれぞれ別のリポジトリがあるほうがいいと思ったら? しまった、履歴をどうするよ?