因此,我们团队中的某个人将整个文件夹移动到子目录中,而不使用hg的重命名功能。目录结构就像我们需要的那样,但历史在移动之前已经消失了。它在移动发生时显示为新文件。自那时以来发生了许多大规模的合并,所以回到过去并做正确的事情并不切实可行。
我尝试了hg log --follow
并没有帮助,因为hg不知道重命名。事后是否有任何方法可以手动将文件链接到旧的删除版本,或者是否存在一些像git可以根据hueristics推断移动和重命名的方式?如果有某种方式可以明确地说“这个文件是这个旧的已删除文件的延续。”,即使这仍然需要一些时间来解决这一问题,这将是很好的。
我们几乎已经放弃了历史,但是拥有它真的很棒。
答案 0 :(得分:13)
您需要通过明确告知Mercurial移动了哪些文件,然后合并损坏的更改集来正确重做移动。这样,您将恢复原始文件的历史路径。
步骤,假设<x>
是移动修订版,<y>
是当前的头版修订版。
hg update <x-1>
hg rename
或hg rename --after
hg merge <x>
)合并,这应该没有冲突但是如果丢弃了所有更改。hg merge <y>
)以下是命令行上显示的基本过程:
$ mkdir move-merge-test
$ cd move-merge-test
$ hg init
$ echo "x" > a
$ hg add a
$ hg commit -m "initial revision"
错误移动:
$ mv a b
$ hg remove a
$ hg add b
$ hg status --copies
A b
R a
$ hg commit -m "incorrect move"
$ hg log --follow b
changeset: 1:b22f3e94133b
tag: tip
user: Laurens Holst <...>
date: Wed Oct 19 14:41:37 2011 +0200
summary: incorrect move
纠正此举:
$ hg update 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg rename a b
$ hg status --copies
A b
a
R a
$ hg commit -m "correct move"
created new head
$ hg log --follow b
changeset: 2:5deabbcb5480
tag: tip
parent: 0:b82f89f0c7d9
user: Laurens Holst <...>
date: Wed Oct 19 14:46:35 2011 +0200
summary: correct move
changeset: 0:b82f89f0c7d9
user: Laurens Holst <...>
date: Wed Oct 19 14:36:35 2011 +0200
summary: initial revision
将它与破碎的移动合并:
$ hg merge 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "merge with broken move"
$ hg log --follow b
changeset: 3:ce65fc7b35e4
tag: tip
parent: 2:5deabbcb5480
parent: 1:b22f3e94133b
user: Laurens Holst <...>
date: Wed Oct 19 14:47:13 2011 +0200
summary: merge broken branch
changeset: 2:5deabbcb5480
parent: 0:b82f89f0c7d9
user: Laurens Holst <...>
date: Wed Oct 19 14:46:35 2011 +0200
summary: correct move
changeset: 1:b22f3e94133b
user: Laurens Holst <...>
date: Wed Oct 19 14:41:37 2011 +0200
summary: incorrect move
changeset: 0:b82f89f0c7d9
user: Laurens Holst <...>
date: Wed Oct 19 14:36:35 2011 +0200
summary: initial revision
如您所见,历史记录现在可以正确显示所有受影响的变更集。如果文件在多次提交中移动,则基本原则保持不变,只需合并超过1次提交。如果您在移动后有任何提交,我建议将它们分开合并(上述步骤中的步骤6),以避免虚假冲突。
答案 1 :(得分:3)
通过删除新的(“移动的”)文件,然后在文件仍然存在时返回修订版,正确执行移动(包括提交)并合并两个文件,我很幸运头。
答案 2 :(得分:1)
--after
有一个hg rename
选项,可以告诉Mercurial事后重命名,但必须在提交重命名之前完成。
您可以尝试在存储库上执行hg convert
并指定--filemap
参数,这样您就可以重命名文件和目录。
https://www.mercurial-scm.org/wiki/ConvertExtension#A--filemap