Version control 移动未正确完成时恢复hg中的历史记录

Version control 移动未正确完成时恢复hg中的历史记录,version-control,mercurial,Version Control,Mercurial,因此,我们团队中有人将整个文件夹移动到子目录中,而没有使用hg的重命名功能。目录结构就像我们需要它一样,但是在移动之前,历史记录已经消失了。当移动发生时,它会将其显示为新文件。从那时起,已经发生了许多大型合并,因此,回到过去并正确地进行合并并不实际 我已经尝试了hglog--follow,但是没有帮助,因为hg不知道重命名。是否有任何方法可以在事后手动将文件链接到旧的删除版本,或者是否有一些类似git根据hueristics推断移动和重命名的方法?如果有某种方式可以明确地说,“这个文件是这个旧的

因此,我们团队中有人将整个文件夹移动到子目录中,而没有使用hg的重命名功能。目录结构就像我们需要它一样,但是在移动之前,历史记录已经消失了。当移动发生时,它会将其显示为新文件。从那时起,已经发生了许多大型合并,因此,回到过去并正确地进行合并并不实际

我已经尝试了
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年)这对我不起作用,因为自从错误的移动以来,有更多的更改被合并。我需要保留这些变化,因此劳伦斯的答案似乎是最有用的。