提交后修复Mercurial代码库中的重命名问题

9

我们的Mercurial代码库中有许多文件在单个提交中被移动,但这些文件没有被标记为重命名。更糟糕的是,一些文件在同一个提交中被修改。

我该如何撤销这个提交并正确检测重命名,同时保留更改和文件移动?

3个回答

13

修复重命名的另一种选择是使用 fixrenames 扩展,而不是编辑历史记录(也称为在 MQ 中搞事情)。这里详细介绍了该扩展所使用的逻辑。

手动流程如下。针对每个未标记有重命名的修订版本 N:

$ hg update n-1
$ hg revert --all --rev n
$ hg addremove -s 70
$ hg commit -m "Fix renames from n"
$ hg merge n

请注意,相似性标志有时需要调整。原因是重命名几乎从不是纯粹的重命名。例如,重命名类需要更改文件以及文件名。因此它们并不完全相同。您需要检查addremove的内容,并确保将添加的文件标记为“X(从Y重命名)”。
通过这种方式,您可以恢复完整的历史记录,而无需进行大量手动操作。我今天必须这样做(未使用fixrenames扩展程序),并且需要花费约5分钟来修复。
甚至可以在需要修复的堆叠变更集中应用此过程。
变更集图看起来像这样。考虑变更集A、B、C和D。B和D的重命名不正确:
D
|
C
|
B
|
A

首先,我们更新至A,然后执行就地还原到B,并进行添加删除操作,最后作为E提交。接着,由于C没有任何问题,我们将其合并到E中形成F。您应该会看到如下所示的内容:
F D
|\|
| C
| |
E B
|/
A

现在,将同样的操作应用于 D。我们更新到 F,从 D 进行还原(revert),执行 addremove 并提交到 G。现在,我们只需合并以关闭额外的分支。你应该能够看到类似下面的内容:

H
|\
G |
| |
F D
|\|
| C
| |
E B
|/
A

如果您想让自己相信这有效,您可以随时

hg diff -r D -r H

根据你使用的工具,你可能看不到任何差异,或者列出了重命名的文件,但它们之间没有任何差异。


命令行显示“hg merge n”,但图表显示与“n+1”合并? - Afriza N. Arief

3

MrFox的答案的自动化版本

  1. 将“坏”的变更集导出到补丁文件(可能是git格式),或保存到捆绑包中,或将其转换为MQ补丁。
  2. 将工作目录更新到“坏”变更集的父级目录。
  3. 应用补丁|导入捆绑包。
  4. 在修改后的工作目录中使用hg addremove -s NN以检测重命名(必须手动找到NN,所有重命名都必须在结果中被检测到),使用hg status -C检查猜测结果,重复addremove直到收到正确的结果。
  5. 提交新的好的变更集。

0
  1. 列出所有对文件所做的修改。
  2. 回滚到文件未被移动的版本。
  3. 重命名文件。
  4. 必要时修改文件内部内容。
  5. 提交更改。

列出所有修改,恢复到更改前状态,然后手动更新每个文件似乎是最手动的方法。我希望有一种更自动化、更可靠的方式。 - Petrus Theron
Mercurial 不知道你的更改需要如何不同。没有“用重命名这些文件替换已删除和添加的文件名相似的文件”。在这里使用 Git 会更好,它查看内容并可能建议您更改文件名或其他内容,而不是删除和添加文件。 - MrFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接