Mercurial でリポジトリを簡単に修正する Histedit の使い方
Mercurial で自分のローカルのリポジトリにコミットしてしまった変更を修正する方法です。
Histedit のインストール
Histedit Extension を使いますので、インストールします。
$ hg clone https://bitbucket.org/durin42/histedit
「~/.hgrc」に以下を記載します。hg_histedit.py へのパスを記載します。
[extensions] histedit = /path/to/histedit/hg_histedit.py
チェンジセットの統合
では、以下のようなリポジトリを想定します。
$ hg glog --style compact -l 4 @ 2620[tip] 3a3f178dd767 2011-06-06 12:11 +0900 kenjis | add new file: user_guide_ja/installation/upgrade_203.html | o 2619 f3ca6d702443 2011-06-06 03:00 +0900 hatohato25 | fix about Parentheses format | o 2618 ed67e9fff541 2011-06-06 02:19 +0900 hatohato25 | fix about (optional) format | o 2617 27ab2abcf991 2011-06-06 02:11 +0900 hatohato25 | fix translator's note format |
それでは r2617:27ab2abcf991 以降のチェンジセットを変更してみましょう。
$ hg histedit 2617
エディタが起動し、以下のように表示されます。
pick 27ab2abcf991 fix translator's note format pick ed67e9fff541 fix about (optional) format pick f3ca6d702443 fix about Parentheses format pick 3a3f178dd767 add new file: user_guide_ja/installation/upgrade_203.html # Edit history between 27ab2abcf991 and 3a3f178dd767 # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but fold into previous commit # d, drop = remove commit from history #
チェンジセットが古い順に記載されています。ここで、変更したいチェンジセットを選択します。
p または pick = そのまま e または edit = そのチェンジセットを変更する f または fold = 前のチェンジセットに含める d または drop = そのチェンジセットを削除する
という意味になります。チェンジセットの左の文字を必要に応じて変更して保存します。
例えば、27ab2abcf991 と ed67e9fff541 をまとめて 1つのチェンジセットにしたい場合は、以下のようにします。
pick 27ab2abcf991 fix translator's note format f ed67e9fff541 fix about (optional) format pick f3ca6d702443 fix about Parentheses format pick 3a3f178dd767 add new file: user_guide_ja/installation/upgrade_203.html
保存すると、またエディタが起動します。
fix translator's note format *** fix about (optional) format
2つのチェンジセットのコミットメッセージが表示されていますので、削除して新しいコミットメッセージを記載し保存します。
これで 2つのチェンジセットが 1つになりました。
$ hg glog --style compact -l 4 @ 2619[tip] c05927d364fa 2011-06-06 12:11 +0900 kenjis | add new file: user_guide_ja/installation/upgrade_203.html | o 2618 1a3f07a85268 2011-06-06 03:00 +0900 hatohato25 | fix about Parentheses format | o 2617 38a298f7f1a0 2011-06-06 02:19 +0900 hatohato25 | new commit message | o 2616:2594,2610 b749e72d4217 2011-06-05 20:03 +0900 kenjis |\ merge with Reactor r2474:31b5c1dcf2ed | |
r2617 のチェンジセット ID が 27ab2abcf991 から 38a298f7f1a0 に変わっていることに注意してください。
チェンジセットの変更
続いて r2617:38a298f7f1a0 を変更してみましょう。
$ hg histedit 2617
またエディタが起動し、以下のように表示されます。
pick 38a298f7f1a0 new commit message pick 1a3f07a85268 fix about Parentheses format pick c05927d364fa add new file: user_guide_ja/installation/upgrade_203.html # Edit history between 38a298f7f1a0 and c05927d364fa # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but fold into previous commit # d, drop = remove commit from history #
38a298f7f1a0 の左の文字を以下のように変更し、保存します。
e 38a298f7f1a0 new commit message pick 1a3f07a85268 fix about Parentheses format pick c05927d364fa add new file: user_guide_ja/installation/upgrade_203.html
すると、プロンプトに戻ります。
ファイル状態: 更新数 39、マージ数 0、削除数 1、衝突未解決数 0 中止: Make changes as needed, you may commit or record as needed now. When you are finished, run hg histedit --continue to resume. $
この状態が r2617:38a298f7f1a0 をコミットする前の状態です。r2617 の変更が作業領域に適用されています。
$ hg st M user_guide_ja/changelog.html M user_guide_ja/database/connecting.html M user_guide_ja/general/helpers.html M user_guide_ja/general/views.html M user_guide_ja/libraries/benchmark.html M user_guide_ja/libraries/form_validation.html M user_guide_ja/libraries/image_lib.html M user_guide_ja/libraries/javascript.html M user_guide_ja/libraries/trackback.html
必要な変更をファイルに加え、完了したら、
$ hg histedit --continue
とします。
エディタが起動して現在のコミットメッセージが表示されますので、必要に応じて変更し保存します。
new commit message
ログを確認してみましょう。
$ hg glog --style compact -l 4 @ 2619[tip] e1b1742bd1e7 2011-06-06 12:11 +0900 kenjis | add new file: user_guide_ja/installation/upgrade_203.html | o 2618 f7f36ca1fffd 2011-06-06 03:00 +0900 hatohato25 | fix about Parentheses format | o 2617 22277c1edfbe 2011-06-06 02:19 +0900 hatohato25 | changed commit message | o 2616:2594,2610 b749e72d4217 2011-06-05 20:03 +0900 kenjis |\ merge with Reactor r2474:31b5c1dcf2ed | |
r2617 のコミットメッセージが変更されており、チェンジセットの ID も変わっています。
直前のコミットであれば hg rollback で取り消せますが、それ以前のコミットは標準では簡単には変更できません。Histedit を使えば、簡単に過去のコミットやコミットメッセージを変更できます。MQ よりも簡単です。
ただし、マスターとなるリポジトリに push してしまったチェンジセットは、誰かが pull してしまっている可能性がありますので、簡単には変更できませんので注意しましょう。