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