web-dev-qa-db-ja.com

Mercurialで誤ったコミットメッセージを編集する方法

現在TortoiseHg(Mercurial)を使用していますが、誤って誤ったコミットメッセージをコミットしました。リポジトリでこのコミットメッセージを編集するにはどうすればよいですか?

329
maxyfc

更新:Mercurialは--amendを追加しました。これは 現在の推奨オプション です。


hg rollbackを使用して、最後のコミット(ただし最後のコミットのみ)をロールバックしてから、再適用できます。

重要:これは最新のコミットを永久に削除します(またはプル)。したがって、hg updateを実行した場合、そのコミットは作業ディレクトリに存在しなくなり、永久に消えてしまいます。 最初にコピーを作成します。

それ以外は、リポジトリ内のすべてがチェックサムされるため、リポジトリの履歴(コミットメッセージを含む)を変更することはできません。できることは、特定の変更セットの後に履歴を整理し、それに応じて履歴を再作成することだけです。

変更をすでに公開している場合(すべてのコピーを取得できない場合)、これは機能しません。また、GPG署名付きコミット(他の人による)を含む「履歴の書き換え」もできません。

243
Thilo

まあ、私はこの方法を使用していました:

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
90
Antonio Beamud

朗報:hg 2.2 ちょうど追加された gitのような--amendオプション。

tortoiseHgでは、コミットボタンの右側にある黒い矢印を選択して、「現在のリビジョンを修正」を使用できます。

a

65
prime23

これは古い投稿であり、質問に回答済みのマークを付けました。最近同じものを探していましたが、histedit拡張機能が非常に便利であることがわかりました。プロセスはここで説明されます:

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

45
Curious2learn

最後の操作は問題のコミットでした

最後の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でテスト済み)

20
maxschlepzig

TortoiseHgで、変更するリビジョンを右クリックします。 Modify History-> Import MQを選択します。これにより、Mercurialチェンジセットから選択したリビジョンまでのすべてのリビジョンがMercurialキューパッチに変換されます。メッセージを変更するパッチを選択すると、画面がMQエディターに自動的に変更されます。画面の中央にあるメッセージを編集し、QRefreshをクリックします。最後に、パッチを右クリックして、「ヒストリーの変更」->「パッチの終了」を選択します。これにより、パッチが変更セットに戻されます。

ああ、これはMQがこのリポジトリ上のTortoiseHGのアクティブな拡張機能であると仮定しています。そうでない場合は、「ファイル」->「設定」をクリックし、「拡張機能」をクリックして、「mq」チェックボックスをクリックできるはずです。拡張機能がアクティブになる前にTortoiseHgを閉じる必要があるため、閉じてから再度開くように警告する必要があります。

18
knockNrod

他の人が述べたように、MQ拡張機能はこのタスクにより適しています。作業を破壊する危険はありません。これをする:

  1. 次のようなものをhgrc:に追加して、MQ拡張機能を有効にします。
     [拡張子] 
     mq = 
    
  2. 編集する変更セットに更新します。通常はtip:
     hg up <rev> 
    
  3. 現在の変更セットをキューにインポートします:
     hg qimport -r。
    
  4. パッチを更新し、コミットメッセージを編集します。
     hg qrefresh -e 
    
  5. 適用されたすべてのパッチ(この場合は1つ)を終了し、通常の変更セットとして保存します:
     hg qfinish -a 
    

私はTortoiseHgに精通していませんが、コマンドは上記のものに似ているはずです。また、編集履歴は危険であることに言及する価値があると思います。 absolutelyチェンジセットが他の場所にプッシュまたはプルされていないことが確実な場合にのみ実行してください。

ロールバックと再適用は非常に簡単なソリューションですが、最後のコミットでのみ役立ちます。 Mercurial Queuesははるかに強力なものです(「hg q *」コマンドを使用するには、 Mercurial Queues Extensionを有効にする が必要です)。

6
Anton N. Petrov

編集したいリビジョンがそれほど古くない場合に使用するハック:

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
1
Doru Chiulan

私はこのようにしました。まず、変更をプッシュしないでください。そうしないと、運が悪くなります。 collapse 拡張機能を入手してインストールします。別のダミーのチェンジセットをコミットします。次に、collapseを使用して、前の2つの変更セットを1つに結合します。新しいコミットメッセージのプロンプトが表示され、開始点として既にあるメッセージが表示されます。元のコミットメッセージを効果的に変更しました。

1
jls

MQ拡張機能と デバッグコマンド を使用した別のアプローチがあります。これは、データを失うことなく履歴を変更する一般的な方法です。 Antonio と同じ状況を想定してみましょう。

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498
0
Crend King

上記の議論の小さな宝石-@Codestと@Kevin Pullinに感謝します。 TortoiseHgには、コミットボタンの横にドロップダウンオプションがあります。 「現在のリビジョンを修正」を選択すると、コメントとファイルのリストが表示されます。 SO便利。

0
Merlin