我目前正在使用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
选项.
在togoiseHg中,您可以通过选择提示按钮右侧的黑色箭头来使用"修改当前版本"
我知道这是一个旧帖子,你把问题标记为已回答.我最近在找同样的东西,我发现histedit
扩展非常有用.这个过程在这里解释:
http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html
要在上次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测试)
在TortoiseHg中,右键单击要修改的修订.选择Modify History-> Import MQ.这将把Mercurial变更集中所有修订版本(包括所选修订版本)转换为Mercurial Queue补丁.选择要为其修改消息的修补程序,它应自动将屏幕更改为MQ编辑器.编辑屏幕中间的消息,然后单击QRefresh.最后,右键单击补丁并选择Modify History-> Finish Patch,它会将补丁从补丁转换回更改集.
哦,这假设MQ是此存储库中TortoiseHG的活动扩展.如果没有,您应该能够单击文件 - >设置,单击扩展,然后单击mq复选框.它应警告您在扩展处于活动状态之前必须关闭TortoiseHg,因此关闭并重新打开.
正如其他人所提到的,MQ扩展更适合这项任务,并且您不会冒破坏工作的风险.去做这个:
通过向hgrc添加类似这样的内容来启用MQ扩展:
[extensions] mq =
更新要编辑的变更集,通常是提示:
hg up
将当前变更集导入队列:
hg qimport -r .
刷新补丁,编辑提交消息:
hg qrefresh -e
完成所有应用的修补程序(在本例中为一个)并将它们存储为常规更改集:
hg qfinish -a
我不熟悉TortoiseHg,但命令应该与上面的命令类似.我也相信值得一提的是编辑历史是有风险的; 只有在你完全确定变更集没有被推到或从其他任何地方撤出时,你才应该这样做.
回滚和重新应用实际上是简单的解决方案,但它只能帮助上次提交.Mercurial Queues功能更强大(请注意,您需要启用Mercurial Queues Extension才能使用"hg q*"命令).