我们的Mercurial代码库中有许多文件在单个提交中被移动,但这些文件没有被标记为重命名。更糟糕的是,一些文件在同一个提交中被修改。
我该如何撤销这个提交并正确检测重命名,同时保留更改和文件移动?
我们的Mercurial代码库中有许多文件在单个提交中被移动,但这些文件没有被标记为重命名。更糟糕的是,一些文件在同一个提交中被修改。
我该如何撤销这个提交并正确检测重命名,同时保留更改和文件移动?
修复重命名的另一种选择是使用 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
D
|
C
|
B
|
A
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
根据你使用的工具,你可能看不到任何差异,或者列出了重命名的文件,但它们之间没有任何差异。
MrFox的答案的自动化版本
hg addremove -s NN
以检测重命名(必须手动找到NN,所有重命名都必须在结果中被检测到),使用hg status -C
检查猜测结果,重复addremove直到收到正确的结果。