Mercurialでchangeset圧縮

Gitのchangeset圧縮がうらやましいので、
MercurialQueueを利用してやってみた。
概ね↓を参考にした。
ursmの日記

最初からMercurialQueueで管理していない場合のやり方です。

branchのMercurialQueueへのpatchに変換

Rev:298〜Rev:301のbranchのRev:298〜Rev:300を圧縮するとする。
まず該当branchのheadに移動する

hg update 301


qimportでRev:298〜Rev:301をMercurialQueueのpatchに変換する。

hg qimport -r 298:301


このとき例えばRev:299だけ別のbranchなどという場合は、
Rev:299がネックになってしまいできないので、
Rev:299を除外してコマンド実行を分割する。

hg qimport -r 300:301
hg qimport -r 298


すべてappliedになっている。

hg qseries -v
0 A 298.diff
1 A 299.diff
2 A 300.diff
3 A 301.diff

changeset圧縮

圧縮対象のchangesetのうち一番基底のchangesetのpatchのみappliedされているようにする。
今回は0番なので以下のようにする。

hg qgoto 0
hg qseries -v
0 A 298.diff
1 U 299.diff
2 U 300.diff
3 U 301.diff

次のpatchの番号(今回は基底が0なので1)を指定してqfoldでpatchを統合する。
統合したので番号がずれて、その次のpatchの番号は先ほど使用したものと変わらない。
対象のpatchをすべて統合し終えるまで同じオプションでqfoldを繰り返す。
(qseriesは表示確認なので実際にはやらなくていい)

hg qfold 1
hg qseries -v
0 A 298.diff
1 U 300.diff
2 U 301.diff
hg qfold 1
hg qseries -v
0 A 298.diff
1 U 301.diff


この時、個々のchangesetのcommit logも連結される。

繰り返し

branch内に複数の圧縮対象changeset群がある場合は、
基底のpatchにqgotoで移動してqfoldで圧縮という作業を繰り返す。

commit

すべてのpatchをappliedにして、

hg qpush -a

すべてのpatchをchangesetに変換。

hg qfinish -a