Mercurial存储库中的许多文件都在一次提交中移动,但这些文件未标记为重命名。更糟糕的是,一些文件也在同一次提交中被修改。
如何在保持更改和文件移动的同时,撤销变更集并正确检测重命名?
答案 0 :(得分:11)
还有一种替代历史编辑(也就是在MQ中捣乱)来修复重命名。手动过程概述为here,作为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
根据您的工具,您会看到列出的没有差异或重命名的文件,但它们之间没有差异。
答案 1 :(得分:2)
MrFox的自动版本答案
hg addremove -s NN
以检测重命名(必须手动找到NN,必须在结果中检测所有重命名),检查使用hg status -C
进行猜测的结果,重复adremove直到答案 2 :(得分:0)