重命名旧提交

时间:2012-06-25 09:01:07

标签: mercurial

是否有 安全方式 重命名一个旧提交(在此期间没有发生分支),这是从当前提示开始的五六次提交?

2 个答案:

答案 0 :(得分:3)

这取决于你是否已经将此提交推送到公共回购,或者共同合并。当提交已公开可见时,之后无法更改提交。此外,可能MQ工作不允许在之后编辑合并提交。

当提交不公开可见时,您可以将所有提交导入MQ(启用mq扩展并为您的提交是祖先的每个修订调用hg qimport -r»Revision«)。然后,您使用hg qpop --all取消应用所有修补程序。之后,当提交确实引入新的分支名称时,您可以使用hg branch »name«更改分支名称,这也是您需要调用的(在qpop之后,您的提交的祖先的分支名称将用于下一个qpush命令,如果没有明确设置分支名称)。如果要编辑提交消息,可以hg qpush && hg qrefresh -e执行此操作。要完成编辑,请致电hg qpush --all && hg qfinish --applied

编辑:示例工作流程

说这是初始状态,你想编辑4:

8 [default] (tip)
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0

现在您将所有修订版本(包括4个)导入到hg qimport -r 4:8的mercurial队列中,现在您有以下历史记录:

8 [default] (8.diff, qtip, tip)
|
7 (7.diff)
|
6 (6.diff)
|
5 (5.diff)
|
4 (4.diff, qbase)
|
3 (qparent)
|
2
|
1
|
0

下一步是取消应用所有补丁:hg qpop --all

3 [default] (tip)
|
2
|
1
|
0

不要惊慌,你的历史不会消失,它仍然存在于.hg / patches中。现在可以使用hg branch newbranch设置分支名称。在创建新提交之前,这在历史记录中不可见。但分支名称可以显示hg branch

现在可以使用hg qpush重新应用第一个冻结提交:

4 [newbranch] (4.diff, qbase, qtip, tip)
|
3 [default] (qparent)
|
2
|
1
|
0

现在,您可以使用hg qrefresh --edit重新提交提交消息。您还可以通过编辑工作副本中的某些文件来更改内容。因此,如果您只想更改提交消息,请确保在调用hg qrefresh之前未修改工作副本中的任何文件。如果您在致电hg status之前运行hg qrefresh,则可以查看此内容。

  4 [newbranch] (4.diff, qbase, qtip, tip) {new commit message}
 /
3 [default] (qparent)
|
2
|
1
|
0

您可以使用hg qpushhg qpop导航到每个提交,以进一步修改提交。完成后,您需要将补丁转换回常规修订版。这是通过应用所有修补程序并完成队列来完成的。这是由hg qpush --all完成的,后跟`hg qfinish --all。现在历史看起来像这样:

  8 [newbranch] (tip)
  |
  7
  |
  6
  |
  5
  |
  4 {new commit message}
 /
3 [default]
|
2
|
1
|
0

答案 1 :(得分:0)

由于这是一个未被推送到任何地方的私人仓库,因此编辑历史记录应该非常安全。 (请注意,在一般情况下,历史编辑不是一个可行的选项。它仅适用于尚未发布回购的情况。)

有许多Mercurial扩展允许编辑历史记录,mq是其中之一。但是,histedit扩展名可能更容易。它不包含在Mercurial中,但可以从https://www.mercurial-scm.org/wiki/HisteditExtension轻松安装。

一旦设置完毕:

$ hg histedit -r $ID_OF_THE_CHANGESET_YOU_WANT_TO_EDIT

这将打开您通常用于hg commit的任何文本编辑器,其中包含更改集列表;此列表包含之后的每个变更集您指定的变更集,因此请滚动到底部。对于每个变更集,您都会看到类似的内容:

pick 2d5657b340e5 The original message for that commit

对于您需要修改的变更集,请将pick更改为edit。然后保存并退出。回到shell提示符,执行:

$ hg histedit --continue

并且会像往常一样提示您提交新的提交消息。