2011/03/22

Mercurial で過去のログメッセージを変更する

@ Mercurial 1.8.1
@ TortoiseHg 2.0.2

Mercurial は一つ前のコミットをロールバックでなかったことにできますが、2つ以上前のログを変更する方法はあまり公開されていない気がします。
しかし、MQというキューを管理するExtensionを使えば、比較的簡単に実現することができます。
といっても、以下のような制約があるので、実用できる場面は少ないかもしれません。
  • Synchronize 先には反映されません
    (最後に例を載せておきます)
  • マージポイント以前には戻れません

以下では、TortoiseHg を使った例を示しますが、コマンドラインでも可能です。コマンドラインユーザはきっとMQもバリバリ使いこなしているかと思うので、こんな説明は必要ないでしょう。(超勝手な想像だな…)



  1. MQが有効になっていない場合は、MQを有効にします
    右クリック → TortoiseHg → Global Settings → エクステンション → mq にチェック

  2. repository が次のような状態になっていて、Revision 2 を変更したいとします
    Revision 2 を右クリック → 履歴を修正 → MQへインポート

  3. 表示 → パッチキュー

  4. 下にパッチキューウィンドウが表示されます
    まず、全てのパッチを適用解除します。

  5. 編集したいパッチ(2.diff)だけ適用します

  6. パッチキューウィンドウの中心に編集したいコメントが表示されているはずなので、コメントを修正したら、パッチ更新をクリックします

  7. 全てのパッチを適用

  8. 先頭のリビジョンを選択して、
    右クリック → 履歴を修正 → パッチを通常リビジョン化

以上でコメントの修正は完了です。

ちなみに、MQについて理解を深めたい方は、2の段階(MQにインポートした段階)で、 .hg/patches ディレクトリを覗いてみてください。
各リビジョンのパッチが diff ファイルの形でおいてあるのがわかると思います。
これらのパッチをいじって、適用、適用解除を試してみると、MQの仕組みがよくわかると思います。
私は最初、コマンドラインでMQを使ってたのですが、TortoiseHg でいじってみて、すごく理解が深まりました。「見える化」大切ですね。(私の理解力が低いって話もありますが…)

MQは、本来は他の人がパッチを送ってくれた場合に試すための仕組みみたいですが、使ってみるといろいろ応用が効きそうです。
あ、もちろん、実験的な変更をする場合は、テスト用の repository でやるか、clone してからやってください。


注:
上記、MQの適用ですが、Synchronize 先の repository には適用されません。
Synchronize してから上記の変更を加えて、また Synchronize すると以下のように別ブランチになってしまいますのでご注意を。

0 件のコメント: