在我的项目中,由于无知,我没有使用hg remove
,hg mv
或hg addremove
。因此,每次我重命名或移动文件时,该文件的历史记录都已混乱,现在当我查看单个文件的历史记录时,我只会看到历史记录的一部分。 / p>
我正在寻找的是一种回溯并追溯修复所有重命名错误的方法,以便文件历史记录保持在一起。我想象的最有可能是在" .hg \ store \ data"中编辑数据的方法。使这项工作。我一直在尝试,我在我重命名的文件的数据中看到了copy:
和copyrev:
行,所以我怀疑它与它有关。
假设我控制了中央存储库,并且当前没有它的克隆。
答案 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看起来好像是从无处开始(因为实际上是从头开始),这有点奇怪。