max*_*yfc 333 version-control mercurial commit-message tortoisehg mercurial-commit
我目前正在使用TortoiseHg(Mercurial)并意外地提交了错误的提交消息.如何在存储库中编辑此提交消息?
Thi*_*ilo 248
更新: Mercurial已添加--amend,现在应该是首选选项.
您可以使用hg rollback然后重新应用最后一次提交(但只返回最后一次提交).
重要说明:这将永久删除最新的提交(或拉取).所以如果你已经完成了hg update那个提交不再在你的工作目录中那么它就永远消失了.所以先复制一份.
除此之外,您无法更改存储库的历史记录(包括提交消息),因为其中的所有内容都经过检查求和.您唯一能做的就是在给定的变更集之后修剪历史记录,然后相应地重新创建它.
如果您已经发布了更改(除非您可以获取所有副本),并且您也无法"重写包含GPG签名提交的历史记录"(由其他人),这些都不会起作用.
Ant*_*mud 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
Run Code Online (Sandbox Code Playgroud)
Cur*_*arn 46
我知道这是一个旧帖子,你把问题标记为已回答.我最近在找同样的东西,我发现histedit扩展非常有用.这个过程在这里解释:
http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html
max*_*zig 20
要在上次mercurial操作是提交时更改上次提交的提交消息,您可以使用
$ hg rollback
Run Code Online (Sandbox Code Playgroud)
回滚最后一次提交并使用新消息重新提交它:
$ hg ci -m 'new message'
Run Code Online (Sandbox Code Playgroud)
但要小心,因为rollback命令还会回滚以下操作:
- 进口
- 拉
- push(以此存储库为目标)
- 松绑
(见hg help rollback)
因此,如果您不确定最后一个mercurial命令是否为a hg ci,请不要使用hg rollback.
您可以使用随Mercurial一起分发的mq扩展来更改任何提交的提交消息.
这种方法仅在公共中尚未包含要重命名的变更集的克隆存储库时才有用,因为这样做会改变它的变更集哈希以及所有后续变更集.
这意味着您必须能够删除包含要重命名的变更集的所有现有克隆,否则在它们之间推/拉将无效.
要使用mq扩展,你必须明确启用它,例如在UNIX下检查你的~/.hgrc,它应该包含以下行:
[extensions]
mq=
Run Code Online (Sandbox Code Playgroud)
假设您要更改修订版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 <juser@example.org>' >> .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
Run Code Online (Sandbox Code Playgroud)
将其复制到空目录并执行它,例如:
$ bash test.sh 2>&1 | tee log
Run Code Online (Sandbox Code Playgroud)
输出应包含原始更改集消息:
+ hg log
[..]
2 53bc13f21b04 2011-08-31 17:26 +0200 juser
changeset message 3
Run Code Online (Sandbox Code Playgroud)
并重命名操作更改的消息:
+ hg log
[..]
2 3ff8a832d057 2011-08-31 17:26 +0200 juser
CHANGED MESSAGE
Run Code Online (Sandbox Code Playgroud)
(经Mercurial 1.7.5测试)
kno*_*rod 19
在TortoiseHg中,右键单击要修改的修订.选择Modify History-> Import MQ.这将把Mercurial变更集中所有修订版本(包括所选修订版本)转换为Mercurial Queue补丁.选择要为其修改消息的修补程序,它应自动将屏幕更改为MQ编辑器.编辑屏幕中间的消息,然后单击QRefresh.最后,右键单击补丁并选择Modify History-> Finish Patch,它会将补丁从补丁转换回更改集.
哦,这假设MQ是此存储库中TortoiseHG的活动扩展.如果没有,您应该能够单击文件 - >设置,单击扩展,然后单击mq复选框.它应警告您在扩展处于活动状态之前必须关闭TortoiseHg,因此关闭并重新打开.
Dan*_*sen 11
正如其他人所提到的,MQ扩展更适合这项任务,并且您不会冒破坏工作的风险.去做这个:
[extensions] mq =
hg up <rev>
hg qimport -r .
hg qrefresh -e
hg qfinish -a
我不熟悉TortoiseHg,但命令应该与上面的命令类似.我也相信值得一提的是编辑历史是有风险的; 只有在你完全确定变更集没有被推到或从其他任何地方撤出时,你才应该这样做.
回滚和重新应用实际上是简单的解决方案,但它只能帮助上次提交.Mercurial Queues功能更强大(请注意,您需要启用Mercurial Queues Extension才能使用"hg q*"命令).
| 归档时间: |
|
| 查看次数: |
128689 次 |
| 最近记录: |