hg convert --splicemap でリポジトリ変換時に履歴を繋ぐ #mercurialjp

このエントリは Mercuiral Advent Calendar 2012 の25日目です。

またまたid:flying-foozyさんからネタを提供していただきました。長かったMercurial Advent Calendarもこれが最後です。

単にhg convertで変換してみる

リポジトリ変換を行うhg convert。ブランチのあるsubversionリポジトリで変換を行うとマージの無い履歴が出来ます。

$ hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ apache-commons-dbcp-no-splicemap
# https://bitbucket.org/troter/apache-commons-dbcp-no-splicemap

変換したリポジトリのグラフはこんな感じでマージが無いです。

f:id:troter:20121226004001p:plain

--splicemap で履歴にマージを作る

この履歴、マージが無いので--splicemapを使って無理矢理作って見ましょう。(というのも、DBCPはtrunkに変更を入れて、その変更をbranchに取り込むという方式、つまりgraftする運用なのでマージは不要なのです。)

slipemapファイルには二つの書式が有ります。今回はマージの場合を使います。

対象のリビジョン 対象のリビジョンの親1 # ブランチングの場合
対象のリビジョン 対象のリビジョンの親1 対象のリビジョンの親2 # マージの場合

splicemap

先ほど変換したリポジトリdbcp-hg/.hg/shamap を参考にDBCP_1_4_x_BRANCHの分だけ作って見ます。

svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1039158 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1028593 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1039158
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1055296 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1039158 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1055296
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1056867 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1055296 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1056867
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1088644 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1084406 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1088645
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096257 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096256 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096255
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096260 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096257 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096259
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096546 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096260 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096543
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096549 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096546 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096550
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096567 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096549 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096567
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096570 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096567 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096570
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097625 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097170 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1097630
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1098458 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097625 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1098459
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1222740 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1214435 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1222742
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1302397 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1222740 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1302423

このsplimemapをつかってリポジトリを変換し直して見ましょう。

% hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ --splicemap dbcp-splicemap apache-commons-dbcp-use-splicemap
# https://bitbucket.org/troter/apache-commons-dbcp-use-splicemap

変換したリポジトリのグラフを見るとDBCP_1_4_x_BRANCHからtrunkにマージしているグラフになっていますね。

f:id:troter:20121226004037p:plain

--datesortでスリムにする

さて、先ほど変換したリポジトリですが、DBCP_1_4_x_BRANCHのコミットが連続している為、グラフが左右にぐわーっと広がっています。これはhg convertはデフォルトで--branchsortで履歴をソートするからです。 マージを組み込むとこのソートだと不便なので、--datesortを使って日付順にしてみましょう。

% hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ --splicemap dbcp-splicemap --datesort apache-commons-dbcp-use-splicemap-datesort
# https://bitbucket.org/troter/apache-commons-dbcp-use-splicemap-datesort

変換したリポジトリのグラフを見てみましょう。Mercurialリポジトリの様にいい感じになってますね。

f:id:troter:20121226004057p:plain

まとめ

リポジトリ変換時に履歴を整形する --splicemap について紹介しました。また、履歴のソート順を制御する--branchsort--datesortに付いても触れました。

hg convertには他にも--branchmap--authormapなど様々な方法でリポジトリの変換方法を制御出来ます。 詳しくはhg convertのマニュアルを参照して、きれいに変換してあげてください。