追溯使用Mercurial重命名

时间:2017-05-04 18:14:14

标签: mercurial

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

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

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

2 个答案:

答案 0 :(得分:1)

摘要:

由于您可以完全控制存储库,因此可以使用常规的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来完成许多这些步骤。

答案 1 :(得分:1)

此答案涵盖了您无法完全控制存储库的情况。这有点棘手,您无法完全清除结果,但是仍然可以使用常规的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看起来好像是从无处开始(因为实际上是从头开始),这有点奇怪。