Version control 移动未正确完成时恢复hg中的历史记录
因此,我们团队中有人将整个文件夹移动到子目录中,而没有使用hg的重命名功能。目录结构就像我们需要它一样,但是在移动之前,历史记录已经消失了。当移动发生时,它会将其显示为新文件。从那时起,已经发生了许多大型合并,因此,回到过去并正确地进行合并并不实际 我已经尝试了Version control 移动未正确完成时恢复hg中的历史记录,version-control,mercurial,Version Control,Mercurial,因此,我们团队中有人将整个文件夹移动到子目录中,而没有使用hg的重命名功能。目录结构就像我们需要它一样,但是在移动之前,历史记录已经消失了。当移动发生时,它会将其显示为新文件。从那时起,已经发生了许多大型合并,因此,回到过去并正确地进行合并并不实际 我已经尝试了hglog--follow,但是没有帮助,因为hg不知道重命名。是否有任何方法可以在事后手动将文件链接到旧的删除版本,或者是否有一些类似git根据hueristics推断移动和重命名的方法?如果有某种方式可以明确地说,“这个文件是这个旧的
hglog--follow
,但是没有帮助,因为hg不知道重命名。是否有任何方法可以在事后手动将文件链接到旧的删除版本,或者是否有一些类似git根据hueristics推断移动和重命名的方法?如果有某种方式可以明确地说,“这个文件是这个旧的已删除文件的延续”,那就太好了,尽管这仍然需要一些时间来修复它
我们几乎已经放弃了找回那段历史,但拥有它真的很好 有一个--after
选项用于hg rename
,可以让您在事后告诉Mercurial有关重命名的信息,但必须在提交重命名之前完成
您可以尝试在存储库上执行hgconvert
,并指定--filemap
参数,这将允许您重命名文件和目录
我很幸运地删除了新的(“移动”)文件,然后在文件仍然存在时返回到修订版,正确地执行移动(包括提交)并合并两个头。您需要通过明确地告诉Mercurial移动了哪些文件来正确地重新执行移动,然后合并断开的变更集。这样,您将恢复原始文件的历史路径 步骤,假设
是移动版本,
是当前头部版本
hg Update
hg rename
或hg rename--after
hg Merge
),这应该没有冲突,但如果存在,则放弃所有更改hg Merge
)$ 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
$mv a b
$hg删除一个
$hg加b
$hg状态-副本
A b
R a
$hg提交-m“错误移动”
$hg日志--跟随b
变更集:1:b22f3e94133b
标签:提示
用户:Laurens Holst
日期:星期三10月19日14:41:37 2011+0200
小结:不正确的移动
纠正这一做法:
$ 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更新0
1个文件已更新,0个文件已合并,1个文件已删除,0个文件未解析
$hg重命名为a b
$hg状态-副本
A b
A.
R a
$hg提交-m“正确移动”
创建新的头
$hg日志--跟随b
变更集:2:5deabbcb5480
标签:提示
父项:0:b82f89f0c7d9
用户:Laurens Holst
日期:星期三10月19日14:46:35 2011+0200
小结:正确的举动
变更集:0:b82f89f0c7d9
用户:Laurens Holst
日期:星期三10月19日14:36:35 2011+0200
摘要:初步修订
将其与断开的移动合并:
$ 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
$hg合并1
1个文件已更新,0个文件已合并,0个文件已删除,0个文件未解析
(分支合并,不要忘记提交)
$hg commit-m“与断开的移动合并”
$hg日志--跟随b
变更集:3:ce65fc7b35e4
标签:提示
家长:2:5DEABCB5480
家长:1:b22f3e94133b
用户:Laurens Holst
日期:星期三10月19日14:47:13 2011+0200
摘要:合并断开的分支
变更集:2:5deabbcb5480
父项:0:b82f89f0c7d9
用户:Laurens Holst
日期:星期三10月19日14:46:35 2011+0200
小结:正确的举动
变更集:1:b22f3e94133b
用户:Laurens Holst
日期:星期三10月19日14:41:37 2011+0200
小结:不正确的移动
变更集:0:b82f89f0c7d9
用户:Laurens Holst
日期:星期三10月19日14:36:35 2011+0200
摘要:初步修订
如您所见,历史记录现在正确地显示了所有受影响的变更集。如果文件在多次提交中移动,则基本原则保持不变,只需跨多个提交合并即可。如果您在移动后进行了任何提交,我建议将它们单独合并(上述步骤中的步骤6),以避免虚假冲突。具体来说,有一个提交会删除一组文件,还有一个提交一个或两个,它会添加一堆文件。提交后无法手动链接。这些操作必须在执行“移动”时完成,然后才能提交。我不确定转换将如何工作。我会将原始路径重命名为新路径,还是反之亦然?我将不得不让整个团队转向新的回购协议,这是不太可取的。这对我很有效。某种程度上。有一次这样做让我的历史更加回到了另一次糟糕的移动发生的地方,我不得不做两次来获得完整的历史。有趣的是,历史在第一次糟糕的移动中一直持续到第二次之前。第二个杀了它,我不得不从第一个坏动作之前重新命名。不知道是什么原因导致了这种不稳定,但现在似乎已经得到了修复。开始遵循此指南,然后注意到我的文件被正确重命名,只是(持续4.5年)这对我不起作用,因为自从错误的移动以来,有更多的更改被合并。我需要保留这些变化,因此劳伦斯的答案似乎是最有用的。