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

时间:2009-03-08 04:42:39

标签: version-control mercurial tortoisehg commit-message mercurial-commit

我目前正在使用TortoiseHg(Mercurial)并意外提交了错误的提交消息。如何在存储库中编辑此提交消息?

12 个答案:

答案 0 :(得分:242)

更新:Mercurial已添加--amend,应为the preferred option now


您可以使用hg rollback回滚最后一次提交(但只返回最后一次提交),然后重新应用它。

重要:此会永久删除最新提交(或拉取)。因此,如果您已经完成了hg update提交不再在您的工作目录中,那么它将永远消失。 首先制作副本。

除此之外,您无法更改存储库的历史记录(包括提交消息),因为其中的所有内容都经过校验和。您唯一能做的就是在给定的变更集之后修剪历史记录,然后相应地重新创建它。

如果您已经发布了更改(除非您可以获取所有副本),并且您也无法“重写包含GPG签名提交的历史记录”(由其他人),这些都不会起作用。

答案 1 :(得分:90)

好吧,我曾经这样做过:

想象一下,你有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

答案 2 :(得分:63)

好消息:hg 2.2 just added git like --amend选项。

并且在togohiseHg中,您可以通过选择提交按钮右侧的黑色箭头来使用“修改当前版本”

a

答案 3 :(得分:45)

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

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

答案 4 :(得分:20)

上次操作是有问题的提交

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

$ hg rollback

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

$ hg ci -m 'new message'

但要小心,因为rollback命令也会在操作后回滚:

  
      
  • 进口      
        
    •   
    • 推送(以此存储库作为目标)
    •   
    • 解除捆绑
    •   
  •   

(见hg help rollback

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

更改任何其他提交消息

您可以使用与Mercurial一起分发的mq extension来更改任何提交的提交消息。

此方法仅在公共中尚未包含要重命名的变更集的克隆存储库时才有用,因为这样做会更改变更集散列以及所有后续变更集。

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

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

[extensions]
mq=

假设您要更改修订版X - 首先qimport导入修订版X及其后续版本。现在,它们被注册为一堆应用的补丁。弹出(qpop)除X以外的完整堆栈使X可通过qrefresh进行更改。提交消息更改后,您必须再次推送所有修补程序(qpop)以重新应用它们,即重新创建以下修订。不需要任何补丁堆栈,因此可以通过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.5测试)

答案 5 :(得分:18)

在TortoiseHg中,右键单击要修改的修订。选择修改历史记录 - &gt;导入MQ。这将把Mercurial变更集中所有修订版本(包括所选修订版本)转换为Mercurial Queue补丁。选择要为其修改消息的修补程序,它应自动将屏幕更改为MQ编辑器。编辑屏幕中间的消息,然后单击QRefresh。最后,右键单击补丁并选择Modify History-&gt; Finish Patch,它会将补丁从补丁转换回更改集。

哦,这假设MQ是此存储库中TortoiseHG的活动扩展。如果没有,您应该可以单击文件 - >设置,单击扩展,然后单击mq复选框。它应该警告你,你必须在扩展激活之前关闭TortoiseHg,这样关闭并重新打开。

答案 6 :(得分:10)

正如其他人所提到的,MQ扩展更适合这项任务,并且您不会冒破坏工作的风险。要做到这一点:

  1. 通过向hgrc添加类似的内容来启用MQ扩展:
    [extensions]
    mq =
    
  2. 更新您要修改的变更集,通常是提示:
    hg up <rev>
    
  3. 将当前变更集导入队列:
    hg qimport -r .
    
  4. 刷新补丁,然后编辑提交消息:
    hg qrefresh -e
    
  5. 完成所有已应用的修补程序(在本例中为一个)并将其存储为常规更改集:
    hg qfinish -a
    
  6. 我不熟悉TortoiseHg,但命令应该类似于上面的命令。我也相信值得一提的是编辑历史是有风险的;只有在绝对确定变更集未被推送到其他任何地方或从其他地方撤出时,您才应该这样做。

答案 7 :(得分:6)

Rollback-and-reapply实际上是一个简单的解决方案,但它只能帮助上次提交。 Mercurial Queues功能更强大(注意你需要enable Mercurial Queues Extension才能使用“hg q *”命令)。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

如果我想编辑的版本不是那么老,我会使用一个hack:

假设你是转速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

答案 10 :(得分:0)

MQ扩展和debug commands还有另一种方法。这是修改历史记录而不会丢失数据的一般方法。让我假设与Antonio相同的情况。

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

答案 11 :(得分:0)

上面讨论中的一个小宝石 - 感谢@Codest和@Kevin Pullin。 在TortoiseHg中,提交按钮旁边有一个下拉选项。选择“修改当前版本”会返回注释和文件列表。太有用了。