如何在Mercurial中编辑不正确的提交消息?

我目前正在使用TortoiseHg(Mercurial),并意外地提交了一个不正确的提交信息。 我该如何去编辑这个提交信息在存储库中?

更新: Mercurial已经添加--amend这应该是现在的首选选项 。


你可以回滚最后一个提交(但只有最后一个)与hg rollback ,然后重新应用它。

重要提示 :这将永久删除最新的提交 (或拉)。 所以如果你已经完成了一个hg update ,提交不再在你的工作目录中,那么它将永远消失。 所以先复制一份。

除此之外,您不能更改存储库的历史logging(包括提交消息),因为那里的所有内容都是检查和。 你可以做的唯一的事情就是修改给定的变更集之后的历史logging,然后相应地重新创build历史logging。

如果您已经发布了您的更改(除非您可以获得所有副本),并且您也不能“重写历史logging”(其他人包含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,你可以使用“修改当前修订版本”selectbutton右边的黑色箭头

一个

我知道这是一个旧的post,你把问题标记为答案。 我最近在寻找同样的东西,我发现histedit扩展非常有用。 这个过程在这里解释:

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

上次操作是有问题的提交

当最后的mercurial操作是可以使用的提交时,更改上次提交的提交消息

 $ hg rollback 

回滚最后一次提交,并用新消息重新提交:

 $ hg ci -m 'new message' 

但要小心,因为回滚命令还会回滚以下操作:

  • import
    • 推送(以此存储库作为目的地)
    • 松绑

(请参阅hg help rollback

因此,如果您不确定最后的mercurial命令是否是hg ci ,请不要使用hg rollback

更改任何其他提交消息

您可以使用随Mercurial分发的mq扩展来更改任何提交的提交消息。

这种方法只有在公共目录中还没有包含要更名的变更集的克隆版本库时才有用,因为这样做会改变变更集和所有后续变更集的哈希值。

这意味着您必须能够删除所有包含您要重命名的变更集的现有克隆,否则在它们之间推/拉将无法工作。

要使用mq扩展名,你必须明确地启用它,例如在UNIX下检查你的~/.hgrc ,它应该包含以下行:

 [extensions] mq= 

假设您要更改修订版本X – 首先import修订版本X及以下版本。 现在他们被注册为一堆应用的补丁。 popup( qpop )除X之外的完整堆栈使X可通过qrefresh进行更改。 提交消息更改后,您必须再次推送所有的补丁( qpop )重新应用它们,即重新创build以下修订版本。 一堆补丁是不需要的,因此可以通过qfinish删除。

以下演示脚本显示所有正在运行的操作。 在这个例子中,第三个变更集的提交信息被重命名。

 # 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.5testing)

在TortoiseHg中,右键单击要修改的修订。 select修改历史 – >导入MQ。 这将把所有修订版本(包括所选修订版本)从Mercurial变更集转换为Mercurial Queue补丁。 select要修改消息的补丁,并自动将屏幕更改为MQ编辑器。 编辑屏幕中间的消息,然后点击QRefresh。 最后,右键单击修补程序,然后select“修改历史logging” – >“完成修补程序”,将其从修补程序转换回修改集。

噢,这个假定MQ是这个仓库上TortoiseHG的一个活跃的扩展。 如果没有,你应该可以点击File-> Settings,点击Extensions,然后点击mqcheckbox。 它应该警告你,你必须closuresTortoiseHg,然后在扩展处于激活状态,closures然后重新打开。

正如其他人所说,MQ扩展更适合这项任务,而且不会冒着破坏工作的风险。 去做这个:

  1. 启用MQ扩展,在hgrc中添加如下内容:
     [扩展]
     mq =
    
  2. 更新到要编辑的更改集,通常提示:
     hg up <rev>
    
  3. 将当前变更集导入到队列中:
     hg qimport -r。
    
  4. 刷新修补程序,然后编辑提交消息:
     hg qrefresh -e
    
  5. 完成所有应用的补丁(在本例中为一个补丁),并将它们存储为常规变更集:
     hg qfinish -a
    

我不熟悉TortoiseHg,但是这些命令应该与上面的类似。 我也相信值得一提的是编辑历史是有风险的, 你应该只做这个,如果你确定变更集没有被推到别的地方,

回滚再应用是一个真正简单的解决scheme,但它只能帮助最后一次提交。 Mercurial Queues是非常强大的function(请注意,您需要启用Mercurial Queues Extension才能使用“hg q *”命令)。

我这样做了。 首先,不要推动你的改变,或者你运气不好。 抓取并安装折叠扩展。 提交另一个虚拟变更集。 然后使用折叠将前两个变更集合为一个。 它会提示你一个新的提交信息,给你的信息,你已经有了一个起点。 您已经有效地更改了您的原始提交消息。

如果我想修改的版本不是那么古老,

假设你在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 

MQ扩展和debugging命令有另一种方法。 这是修改历史logging而不丢失数据的一般方法。 让我想像安东尼奥一样的情况。

 // 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中,在提交button旁边有一个下拉选项。 select“修改当前修订版”可以返回评论和文件列表。 非常有用。