Mercurialで誤ったコミットメッセージを編集する方法[複製]
-
05-07-2019 - |
質問
この質問にはすでに回答があります:
- Mercurial:最後のコミットを修正する方法 7つの答え
現在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 like -amend
オプション。
およびtortoiseHgでは、「現在のリビジョンを修正」を使用できます。コミットボタンの右側にある黒い矢印を選択します
これは古い投稿であり、質問に回答済みのマークを付けました。最近同じものを探していましたが、 histedit
拡張機能が非常に便利であることがわかりました。プロセスはここで説明されています:
http://knowledgestockpile.blogspot。 com / 2010/12 / changing-commit-message-of-revision-in.html
最後の操作が問題のコミットでした
最後の水銀操作がコミットであったときに最後のコミットのコミットメッセージを変更するには、使用できます
$ hg rollback
最後のコミットをロールバックし、新しいメッセージで再コミットするには:
$ hg ci -m 'new message'
ただし、rollbackコマンドは次の操作もロールバックするので注意してください:
- インポート
- プル
- プッシュ(このリポジトリーを宛先として)
- アンバンドル
( hg help rollback
を参照)
したがって、最後の水銀コマンドが hg ci
であったかどうかわからない場合は、 hg rollback
を使用しないでください。
他のコミットメッセージを変更する
mq拡張機能、Mercurialと共に配布され、コミットのコミットメッセージを変更します。
このアプローチは、名前を変更するチェンジセットを含むリポジトリがまだ公開されていない場合にのみ役立ちます。これを行うと、チェンジセットのハッシュと後続のすべてのチェンジセットが変更されるためです。
つまり、名前を変更する変更セットを含む既存のクローンをすべて削除する必要があります。削除しないと、それらの間でプッシュ/プルが機能しません。
mq拡張機能を使用するには、明示的に有効にする必要があります。 UNIXでは、〜/ .hgrc
を確認します。これには次の行が含まれている必要があります。
[extensions]
mq=
リビジョンXを変更するとします-最初に qimport
がリビジョンX以降をインポートします。現在、それらは適用されたパッチのスタックとして登録されています。 Xを除く完全なスタックをポップ( qpop
)すると、Xが qrefresh
を介して変更できるようになります。コミットメッセージが変更された後、すべてのパッチ( 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 <juser@example.org>' >> .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-&gt; Import MQを選択します。これにより、Mercurialチェンジセットから選択したリビジョンまでのすべてのリビジョンがMercurialキューパッチに変換されます。メッセージを変更するパッチを選択すると、画面がMQエディターに自動的に変更されます。画面の中央にあるメッセージを編集し、QRefreshをクリックします。最後に、パッチを右クリックし、[履歴の変更]-> [パッチの終了]を選択します。これにより、パッチが変更セットに戻されます。
ああ、これはMQがこのリポジトリ上のTortoiseHGのアクティブな拡張であると想定しています。そうでない場合は、「ファイル」->「設定」をクリックし、「拡張機能」をクリックして、「mq」チェックボックスをクリックできるはずです。拡張機能がアクティブになる前にTortoiseHgを閉じる必要があることを警告する必要があるため、閉じてから再度開きます。
他の人が言及しているように、MQ拡張機能はこのタスクにより適しています。作業を破壊する危険はありません。これを行うには:
- 次のようなものをhgrcに追加して、MQ拡張を有効にします。
[extensions] mq =
- 編集したい変更セットに更新します。通常は次のようにします。
hg up <rev>
- 現在の変更セットをキューにインポートします。
hg qimport -r .
- パッチを更新し、コミットメッセージを編集します。
hg qrefresh -e
- 適用されたすべてのパッチ(この場合は1つ)を終了し、通常の変更セットとして保存します。
hg qfinish -a
TortoiseHgには慣れていませんが、コマンドは上記のコマンドに似ているはずです。また、編集履歴は危険であることに言及する価値があると思います。チェンジセットが他の場所にプッシュまたはプルされていないことを絶対に確信している場合にのみ実行してください。
Rollback-and-reapplyは非常にシンプルなソリューションですが、最後のコミットでのみ役立ちます。 Mercurial Queuesははるかに強力です(使用するには、 Mercurial Queues Extensionを有効にする必要があります。 &quot; hg q *&quot;コマンド)。
このようにしました。まず、変更をプッシュしないでください。そうしないと、運が悪くなります。 折りたたみ拡張機能を入手してインストールします。別のダミーのチェンジセットをコミットします。次に、collapseを使用して、前の2つの変更セットを1つに結合します。新しいコミットメッセージの入力が求められ、開始点として既に持っているメッセージが表示されます。元のコミットメッセージを効果的に変更しました。
編集したいリビジョンがそれほど古くない場合に使用するハック:
rev 500で、497を編集するとします。
hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500
rev497ファイルを編集して、メッセージを変更します。 (最初の行の後に&quot;#&quot;が続きます)
hg import rev497
hg import rev498
hg import rev499
hg import rev500
MQ拡張機能とを使用した別のアプローチがあります。デバッグコマンド。これは、データを失うことなく履歴を変更する一般的な方法です。 Antonio と同じ状況を想定してみましょう。
// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498
上記の議論の小さな宝石-@Codestと@Kevin Pullinに感謝します。 TortoiseHgには、コミットボタンの横にドロップダウンオプションがあります。 [現在のリビジョンを修正]を選択します;コメントとファイルのリストを戻します。とても便利です。