追溯使用 Mercurial 重命名

Retroactively use Mercurial rename

在我的项目中,由于无知,我没有使用 hg removehg mvhg addremove。因此,每次我重命名或移动文件时,该文件的历史记录都会被打乱,现在当我查看单个文件的历史记录时,我只会看到一部分历史记录。

我正在寻找的是一种返回并追溯修复所有这些重命名错误的方法,以便文件历史记录将保持在一起。我想最有可能的是一种编辑“.hg\store\data”中的数据以使其工作的方法。我一直在试验,我在重命名的文件的数据中看到 copy:copyrev: 行,所以我怀疑这与它有关。

假设我控制了中央存储库并且目前没有它的克隆。

总结:

由于您可以完全控制存储库,因此可以使用普通的 hg 命令 100% 修复此问题。

主要思想是在正确的位置插入新的变更集,从而有效地纠正原始变更集。


假设您的历史记录如下:

A-B-C-*

* 是您的工作文件夹)

并且在 B 中,您在文件系统中重命名了一个文件,而没有在 hg 中重命名它。

这样做:

hg up A
hg revert -r B --all
hg mv oldfilename newfilename
hg commit -m <message>

这里的关键是使用 revert,它用于将变更从变更集中复制到您的工作文件夹中。 只能以这种方式工作,因为您已经更新到要还原的变更集的前身。

此时您的历史记录如下:

A-B-C
 \
  B'-*

其中 B'B 的“更正”变体。继续:

hg rebase -s C -d B'

你有:

A-B
 \
  B'-C-*

您现在可以通过以下方式进行清理:

hg strip B

即将离开:

A-B'-C-*

当然,在我使用像 B 这样的修订版时,您需要键入实际的修订版号或哈希值。

您也可以使用 TortoiseHG 或其他一些 GUI 来执行很多这些步骤。

此答案涵盖了您无法完全控制存储库的情况。它有点棘手,你不能得到完全干净的结果,但它仍然可以使用普通的 hg 命令来处理。

主要思想是在正确的地方插入新的变更集,有效地纠正原始变更集,并在事后合并它们。


假设您的历史记录如下:

A-B-C-*

* 是您的工作文件夹)

并且在 B 中,您在文件系统中重命名了一个文件,而没有在 hg 中重命名它。

这样做:

hg up A
hg mv oldfilename newfilename
hg commit -m <message>

此时您的历史记录如下:

A-B-C
 \
  B'-*

其中 B'B 的“更正”变体。继续:

hg up C
hg merge B'
hg commit

你有:

A-B-C-D-*
 \   /
  B'

如果您查看相关文件的文件历史记录,它将类似于:

o   D   merge
|\
| o B'  rename file
| |
o | B   change where the file should have been renamed
  |
  o A   some earlier change
 /
o   ...
|
o   ...

因此文件的所有历史记录都链接在一起。只是有点奇怪,B 看起来像是从无到有(因为它确实是从无到有)。