9

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

如何在保持更改和文件移动的同时退出变更集并正确检测重命名?

4

3 回答 3

13

历史编辑(又名 MQ 中的乱七八糟)有一个替代方法来修复重命名。此处将手动过程概述为 fixrenames 扩展使用的逻辑。

手动过程如下。对于没有标记重命名的每个修订版本 N:

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

请注意,相似性标志有时需要摆弄。原因是重命名几乎从来都不是纯粹的重命名。例如,重命名一个类需要更改文件以及更改文件名。因此,它们不是 100% 相同的。您必须查看 addremove 的作用,并确保添加的文件被标记为“X(从 Y 重命名)”。

以这种方式,您无需大量手动工作即可恢复完整的历史记录。我今天必须这样做(不使用 fixrenames 扩展),我花了大约 5 分钟来修复。

您甚至可以在需要修复堆叠变更集的情况下应用此过程。

变更集图看起来像这样。考虑变更集 A、B、C 和 D。B 和 D 的重命名不正确:

D
|
C
|
B
|
A

首先我们更新到 A,做一个就地恢复到 B,做 addremove 并作为 E 提交。然后我们将 C 合并到 E 作为 F,因为 C 没有任何问题。您应该看到如下内容:

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

现在对 D 应用相同的内容。我们更新到 F,从 D 恢复,添加删除并提交到 G。现在我们只需合并以关闭额外的头。您应该看到如下内容:

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

如果您想说服自己这有效,您可以随时

hg diff -r D -r H

根据您的工具,您将看到列出的没有差异或重命名的文件,但它们之间没有差异。

于 2013-12-19T16:46:10.907 回答
3

MrFox 答案的自动化版本

  1. 将“坏”变更集的更改导出到补丁文件(可能是 git 格式)或保存到捆绑包或将其转换为 MQ 补丁
  2. 将工作目录更新为错误变更集的父级
  3. 应用补丁|导入包
  4. 在修改后的工作目录中使用hg addremove -s NN以检测重命名(NN 必须手动找到,所有重命名都必须在结果中检测到),检查猜测的结果hg status -C,重复 adremove 直到不会收到正确的结果
  5. 提交新的良好变更集
于 2013-07-30T12:18:18.300 回答
0
  1. Make a list of all modifications made to the files.
  2. Update back to a version where the files had not been moved.
  3. Rename the files.
  4. Modify the file internals, where needed.
  5. Commit.
于 2013-07-30T11:36:31.097 回答