如何修复Mercurial变更集注释中的错误?

时间:2010-04-12 17:39:31

标签: mercurial

如果输入了错误信息,是否有办法重写hg commit消息?我们在提交变更集时始终包含我们的错误ID。例如:

hg commit -m "Bug 14585: LastName field should be mandatory"

但是,如果我输入了错误的错误ID,是否有一种方法(通过扩展可能)在更改集提交并推送到中央存储库后修复注释?

5 个答案:

答案 0 :(得分:4)

如果您还没有任何其他,那么您可以执行“hg rollback”并重新提交。

答案 1 :(得分:3)

histedit扩展程序可能就是您要找的内容。它允许您在事后编辑提交消息。它还允许您删除或折叠修订,就像git rebase --interactive

一样

请注意,您必须在要修复的repo上启用并使用该扩展程序;无法编辑远程仓库的历史记录。另外,我对在中央仓库中使用它非常谨慎。正如蒂姆·波斯特所指出的那样,并不会改变变化集。

答案 2 :(得分:2)

我找到了修复提交消息的方法 IF 错误的变更集仍然是回购的提示。

假设变更集24的评论无效。还假设file1.txt涉及该变更集。您可以对file1.txt进行虚假更改,然后使用不正确的更改集折叠虚假变更集并提供新消息。

cd centralrepo
echo  >> file.txt
hg commit -m "fake commit"

hg collapse 24:25 -m "Bug 14555: LastName field should be mandatory"

这是一个黑客,但它完成了工作,并没有留下纠正的痕迹。创建扩展程序并将其转变为易于使用的解决方案可能不会太难。

答案 3 :(得分:2)

如果回滚&重新提交不是一个选项,或者您已经将更改推送到上游,因此histedit extension本身无济于事,那么mercurials 不可变历史将导致您出现问题。无论你做什么,你都会留下任何悬挂的分支,这些分支明确地poisoned不需要的变更集可以随时重新注入你的存储库。

修复错误

如果您处于这种情况,那么您有几个选项,具体取决于更改传播的距离以及更改集的返回距离。

我过去曾使用过这两种方法。

修复兄弟分支并弃用/删除旧分支

如果它只是少数变更集,并且由于某种原因您无法使用hitsedit扩展,则可以将这些变更集导出为补丁并将其重新应用于父变量。对于第一个变更集(您要更改其历史记录的变更集),您需要使用hg patch --no-commit,然后hg commit使用新邮件。然后,对于其余部分,只需使用hg patch按原样导入更改和提交消息。

这种方法的问题在于你最终会得到两个分支,其中一个分支你需要永远忽略(我会更新到有缺陷的变更集并将分支标记为已弃用,然后再切换回固定分支)。 / p>

或者,您需要找到包含此分支的每个存储库并hg strip它。这里的问题是某些机器可能没有启用Mercurial Queues扩展,如果你甚至错过了一个repo,并且repo与另一个repo同步,则更改开始重新传播。

使用子分支修复并在后续更改中合并

如果变更集已经传播得太远,您可以尝试更新到受影响的版本,强制进行虚拟提交,并在该提交消息中解释先前提交消息的错误。然后,可以将此更改集与您当前的分支提示合并,以使所有内容保持最新。

例如,如果错误的消息是“关闭#5234”并且它应该是“关闭#5324”那么子消息可能是“Uncloses#5234,Closes#5324”。

答案 4 :(得分:1)

Mercurial中的变更集是故意不可变的。如果您已经提交了,那么,不,您无法更改该修订版的文件。但是,有edit the history的指南,但要非常非常非常小心谨慎,不要在此过程中搞砸你的回购。

您似乎只想编辑提交消息,您可以这样做。