当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Mercurial中编辑不正确的提交消息?》经验,为你挑选了8个好方法。

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



1> Thilo..:

更新: Mercurial已添加--amend,现在应该是首选选项.


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

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

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

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


我只是看着一个人因为遵循这个建议而致敬.当建议某人使用`rollback`时,请始终包含一条警告,表明它会永久删除最新的提交(或拉动).因此,如果你已经完成了一个`hg update`(就像他那样)并且提交不再在你的工作目录中,那么它就永远消失了.
避免回滚/翻转灾难的最简单方法是执行简单的更改(添加或删除间距)并在下一个提交消息中解释您的错误.
@rxgx你应该把它作为一个单独的答案发布,因为这可能是最好的答案.

2> Antonio Beam..:

好吧,我曾经这样做过:

想象一下,你有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 qpop`到达正确的补丁后,您还可以使用`hg qrefresh -e`编辑提交消息.
当然,不是'joe',你可以使用任何其他编辑器.
我是MQ的新手,但我认为你必须使用`hg qfinish -a`而不是`hg qdelete -r ...`因为对qdelete的帮助说'不能应用补丁',在示例中的位置应用补丁(并且hgbook指出'qbase和qtip识别"最底部"和最顶部应用的补丁').

3> prime23..:

好消息:hg 2.2 刚刚添加了 git like --amend选项.

在togoiseHg中,您可以通过选择提示按钮右侧的黑色箭头来使用"修改当前版本"

一个


如果你没有改变文件的内容虽然......"没有改变",不允许你提交

4> Curious2lear..:

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

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


当前版本的扩展甚至支持专门用于编辑提交消息的"message"命令.

5> maxschlepzig..:

最后一次操作是有问题的提交

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

$ hg rollback

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

$ hg ci -m 'new message'

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

进口

push(以此存储库为目标)

松绑

(见hg help rollback)

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

更改任何其他提交消息

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

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

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

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

[extensions]
mq=

假设您要更改修订版X - 首先qimport导入修订版X及其后续版本.现在,它们被注册为一堆应用的补丁.Popping(qpop)除了X之外的完整堆栈使X可用于更改qrefresh.提交消息更改后,您必须再次推送所有补丁(qpop)以重新应用它们,即重新创建以下修订.不需要任何补丁堆栈,因此可以通过它删除qfinish.

以下演示脚本显示了所有操作.在该示例中,重命名第三个变更集的提交消息.

# test.sh
cd $(dirname $0)
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 ' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
echo '[extensions]' >> .hg/hgrc
echo 'mq=' >> .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 on 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 $(hg identify -n -r 'children(2)'):tip
hg qseries
echo INFO: Pop patches
hg qpop -a
hg qseries
hg log 
hg parent
hg commit --amend -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测试)



6> 小智..:

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

哦,这假设MQ是此存储库中TortoiseHG的活动扩展.如果没有,您应该能够单击文件 - >设置,单击扩展,然后单击mq复选框.它应警告您在扩展处于活动状态之前必须关闭TortoiseHg,因此关闭并重新打开.



7> 小智..:

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

    通过向hgrc添加类似这样的内容来启用MQ扩展:

    [extensions]
    mq =
    

    更新要编辑的变更集,通常是提示:

    hg up 
    

    将当前变更集导入队列:

    hg qimport -r .
    

    刷新补丁,编辑提交消息:

    hg qrefresh -e
    

    完成所有应用的修补程序(在本例中为一个)并将它们存储为常规更改集:

    hg qfinish -a
    

我不熟悉TortoiseHg,但命令应该与上面的命令类似.我也相信值得一提的是编辑历史是有风险的; 只有在你完全确定变更集没有被推到或从其他任何地方撤出时,你才应该这样做.


使用Mercurial 1.7.5进行测试,您的过程不起作用.`qimport`打印'abort:revision 有非托管的孩子'.什么有效不是调用`hg up`,导入从到tip的所有内容,弹出所有内容,然后调用`hg qrefresh -e`并推送所有东西 - 就像Antonio的回答中所描述的那样.

8> Anton N. Pet..:

回滚和重新应用实际上是简单的解决方案,但它只能帮助上次提交.Mercurial Queues功能更强大(请注意,您需要启用Mercurial Queues Extension才能使用"hg q*"命令).

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有