質問

    

この質問にはすでに回答があります:

         

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

a

これは古い投稿であり、質問に回答済みのマークを付けました。最近同じものを探していましたが、 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拡張機能はこのタスクにより適しています。作業を破壊する危険はありません。これを行うには:

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

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

このようにしました。まず、変更をプッシュしないでください。そうしないと、運が悪くなります。 折りたたみ拡張機能を入手してインストールします。別のダミーのチェンジセットをコミットします。次に、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には、コミットボタンの横にドロップダウンオプションがあります。 [現在のリビジョンを修正]を選択します;コメントとファイルのリストを戻します。とても便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top