現在TortoiseHg(Mercurial)を使用していますが、誤って誤ったコミットメッセージをコミットしました。リポジトリでこのコミットメッセージを編集するにはどうすればよいですか?
更新:Mercurialは--amend
を追加しました。これは 現在の推奨オプション です。
hg rollback
を使用して、最後のコミット(ただし最後のコミットのみ)をロールバックしてから、再適用できます。
重要:これは最新のコミットを永久に削除します(またはプル)。したがって、hg update
を実行した場合、そのコミットは作業ディレクトリに存在しなくなり、永久に消えてしまいます。 最初にコピーを作成します。
それ以外は、リポジトリ内のすべてがチェックサムされるため、リポジトリの履歴(コミットメッセージを含む)を変更することはできません。できることは、特定の変更セットの後に履歴を整理し、それに応じて履歴を再作成することだけです。
変更をすでに公開している場合(すべてのコピーを取得できない場合)、これは機能しません。また、GPG署名付きコミット(他の人による)を含む「履歴の書き換え」もできません。
まあ、私はこの方法を使用していました:
500件のコミットがあり、誤ったコミットメッセージがr.498にあるとします。
hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the Mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip
朗報:hg 2.2 ちょうど追加された gitのような--amend
オプション。
tortoiseHgでは、コミットボタンの右側にある黒い矢印を選択して、「現在のリビジョンを修正」を使用できます。
これは古い投稿であり、質問に回答済みのマークを付けました。最近同じものを探していましたが、histedit
拡張機能が非常に便利であることがわかりました。プロセスはここで説明されます:
http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html
最後のMercurial操作がコミットであったときに、最後のコミットのコミットメッセージを変更するには、使用できます
$ hg rollback
最後のコミットをロールバックし、新しいメッセージで再コミットするには:
$ hg ci -m 'new message'
ただし、rollbackコマンドは次の操作もロールバックするため、注意が必要です。
- インポート
- 引く
- プッシュ(このリポジトリーを宛先として)
- 束ねる
(hg help rollback
を参照)
したがって、最後のMercurialコマンドがhg ci
かどうかわからない場合は、hg rollback
を使用しないでください。
mq extension を使用すると、Mercurialと共に配布され、コミットのコミットメッセージを変更できます。
このアプローチは、名前を変更するチェンジセットを含むリポジトリがまだ公開されていない場合にのみ役立ちます。これを行うと、そのチェンジセットのハッシュと後続のすべてのチェンジセットが変更されるためです。
つまり、名前を変更する変更セットを含む既存のすべてのクローンを削除する必要があります。削除しないと、それらの間のプッシュ/プルは機能しません。
Mq拡張機能を使用するには、明示的に有効にする必要があります。 UNIXでは、~/.hgrc
を確認します。これには次の行が含まれている必要があります。
[extensions]
mq=
リビジョンXを変更するとします-最初にqimport
がリビジョンX以降をインポートします。現在、それらは適用されたパッチのスタックとして登録されています。 Xを除く完全なスタックをポップ(qpop
)すると、qrefresh
を介してXを変更できるようになります。コミットメッセージを変更したら、すべてのパッチ(qpop
)を再度プッシュして再適用する必要があります。つまり、次のリビジョンを再作成します。パッチのスタックは必要ないため、qfinish
を使用して削除できます。
次のデモスクリプトは、実行中のすべての操作を示しています。この例では、3番目の変更セットのコミットメッセージの名前が変更されています。
# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <[email protected]>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log
echo INFO: Push all remaining patches
hg qpush -a
hg log
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent
それを空のディレクトリにコピーして実行します。経由:
$ bash test.sh 2>&1 | tee log
出力には、元の変更セットメッセージが含まれている必要があります。
+ hg log
[..]
2 53bc13f21b04 2011-08-31 17:26 +0200 juser
changeset message 3
そして、名前変更操作が変更されたメッセージ:
+ hg log
[..]
2 3ff8a832d057 2011-08-31 17:26 +0200 juser
CHANGED MESSAGE
(Mercurial 1.7.5でテスト済み)
TortoiseHgで、変更するリビジョンを右クリックします。 Modify History-> Import MQを選択します。これにより、Mercurialチェンジセットから選択したリビジョンまでのすべてのリビジョンがMercurialキューパッチに変換されます。メッセージを変更するパッチを選択すると、画面がMQエディターに自動的に変更されます。画面の中央にあるメッセージを編集し、QRefreshをクリックします。最後に、パッチを右クリックして、「ヒストリーの変更」->「パッチの終了」を選択します。これにより、パッチが変更セットに戻されます。
ああ、これはMQがこのリポジトリ上のTortoiseHGのアクティブな拡張機能であると仮定しています。そうでない場合は、「ファイル」->「設定」をクリックし、「拡張機能」をクリックして、「mq」チェックボックスをクリックできるはずです。拡張機能がアクティブになる前にTortoiseHgを閉じる必要があるため、閉じてから再度開くように警告する必要があります。
他の人が述べたように、MQ拡張機能はこのタスクにより適しています。作業を破壊する危険はありません。これをする:
[拡張子] mq =
hg up <rev>
hg qimport -r。
hg qrefresh -e
hg qfinish -a
私はTortoiseHgに精通していませんが、コマンドは上記のものに似ているはずです。また、編集履歴は危険であることに言及する価値があると思います。 absolutelyチェンジセットが他の場所にプッシュまたはプルされていないことが確実な場合にのみ実行してください。
ロールバックと再適用は非常に簡単なソリューションですが、最後のコミットでのみ役立ちます。 Mercurial Queuesははるかに強力なものです(「hg q *」コマンドを使用するには、 Mercurial Queues Extensionを有効にする が必要です)。
編集したいリビジョンがそれほど古くない場合に使用するハック:
Rev 500で、497を編集するとします。
hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500
Rev497ファイルを編集して、メッセージを変更します。 (「#」が前にある最初の行の後です)
hg import rev497
hg import rev498
hg import rev499
hg import rev500
私はこのようにしました。まず、変更をプッシュしないでください。そうしないと、運が悪くなります。 collapse 拡張機能を入手してインストールします。別のダミーのチェンジセットをコミットします。次に、collapseを使用して、前の2つの変更セットを1つに結合します。新しいコミットメッセージのプロンプトが表示され、開始点として既にあるメッセージが表示されます。元のコミットメッセージを効果的に変更しました。
上記の議論の小さな宝石-@Codestと@Kevin Pullinに感謝します。 TortoiseHgには、コミットボタンの横にドロップダウンオプションがあります。 「現在のリビジョンを修正」を選択すると、コメントとファイルのリストが表示されます。 SO便利。