提交后修复Mercurial存储库中的重命名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提交后修复Mercurial存储库中的重命名相关的知识,希望对你有一定的参考价值。

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

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

答案

有一种替代历史编辑(也就是在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

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

另一答案

MrFox自动版的答案

  1. 将“bad”changeset的更改导出为patch-file(git-format,可能)或保存到bundle或将其转换为MQ-patch
  2. 将工作目录更新为错误变更集的父级
  3. 应用补丁|导入捆绑包
  4. 在修改的工作目录中使用hg addremove -s NN以检测重命名(必须手动找到NN,必须在结果中检测所有重命名),使用hg status -C检查猜测结果,重复adremove直到无法接收到正确的结果
  5. 提出新的良好变革
另一答案
  1. 列出对文件所做的所有修改。
  2. 更新回文件尚未移动的版本。
  3. 重命名文件。
  4. 根据需要修改文件内部。
  5. 承诺。

以上是关于提交后修复Mercurial存储库中的重命名的主要内容,如果未能解决你的问题,请参考以下文章

在 Mercurial 中回滚多个提交(在推送到公共之前)

如何为 mercurial 用户创建别名?

在 Mercurial 存储库中查找大文件

Mercurial 补丁队列用例

如何在 Mercurial 中编辑不正确的提交消息? [复制]

如何修复我的 TortoiseSVN 存储库中的损坏?