1

有没有一种安全的方法来重命名一个旧的提交(同时没有发生分支),它是从当前提示开始的大约五到六个提交?

4

2 回答 2

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)导入到 mercurial 队列中hg qimport -r 4:8,现在您有以下历史记录:

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 qpush您可以通过使用和导航到每个提交来编辑进一步的提交hg qpop。完成后,您需要将补丁转换回信息定期修订。这是通过应用所有补丁来完成的,并完成队列。这是由 完成的hg qpush --all,然后是`hg qfinish --all。现在历史看起来是这样的:

  8 [newbranch] (tip)
  |
  7
  |
  6
  |
  5
  |
  4 {new commit message}
 /
3 [default]
|
2
|
1
|
0
于 2012-06-25T09:46:15.330 回答
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

对于您需要修改的变更集,更改pickedit. 然后保存退出。返回 shell 提示符,执行以下操作:

$ hg histedit --continue

和往常一样,系统会提示您输入新的提交消息。

于 2012-08-04T03:00:57.700 回答