subrepoを試してみた

前から気になってた、Mercurialのsubrepoの使い方がなんとなくわかったのでメモ。

何がうれしいのか

別管理のリポジトリを一緒に扱える。具体的には、共通ライブラリは別のリポジトリで管理しつつ、それを利用するアプリのリポジトリの下に共通ライブラリのリポジトリを配置できる。Subversionで言うところのベンダーブランチとかsvn:externals。

ベンダーブランチ/svn:externalsよりもうれしいのは、アプリ側のリポジトリからライブラリ側のリポジトリのリビジョンが指定できること。アプリ側のリポジトリを特定のリビジョンに更新したら、ライブラリ側のリポジトリもその時指定していたリビジョンに更新される。これはかなり便利。

作り方

まずはアプリ側のリポジトリ生成。これは普通に作る。

hg init

次にディレクトリを作って、ライブラリのリポジトリを作る。新規リポジトリをつくってもいいが、それだとあまり意味が無いので、既存のリポジトリをcloneする。

mkdir subdir
cd subdir
hg clone https://bitbucket.org/toruuetani/virtualenv-scaffold .

最後にsubrepo設定。

cd..
echo subdir = https://bitbucket.org/toruuetani/virtualenv-scaffold > .hgsub

.hgsubの中身はこんな感じで、配置先ディレクトリ = ターゲットのリポジトリパス(ディレクトリでもURLでも可)とする。

subdir = https://bitbucket.org/toruuetani/virtualenv-scaffold

.hgsubをコミットする。

そうするとsubdirが管理下に入るのでコミットする。

コミットすると.hgsubstateがリポジトリに追加される。このファイルに、ライブラリ側のリビジョンが記録される。

この状態だとライブラリ側のリポジトリはdefaultブランチの最新なので、好きなリビジョンに更新する。

cd subdir
hg up c59d68bcc05c

そうすると.hgsubstateもそのリビジョンを指すようになるのでコミット。

こうしてできたアプリ側のリポジトリをcloneして、最新のリビジョンにupdateするとライブラリ側のリビジョンも[c59d68bcc05c]まで更新される。


もちろんライブラリ側のリポジトリは普通のリポジトリでもあるので、変更したらclone元にpushもできる。まだ使い始めたばかりだが、これはかなり便利な気がする。