追溯使用 Mercurial 重命名
Retroactively use Mercurial rename
在我的项目中,由于无知,我没有使用 hg remove
、hg mv
或 hg 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 看起来像是从无到有(因为它确实是从无到有)。
在我的项目中,由于无知,我没有使用 hg remove
、hg mv
或 hg 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 看起来像是从无到有(因为它确实是从无到有)。