移动未正确完成时,以hg恢复历史记录

时间:2011-10-18 23:35:18

标签: version-control mercurial

因此,我们团队中的某个人将整个文件夹移动到子目录中,而不使用hg的重命名功能。目录结构就像我们需要的那样,但历史在移动之前已经消失了。它在移动发生时显示为新文件。自那时以来发生了许多大规模的合并,所以回到过去并做正确的事情并不切实可行。

我尝试了hg log --follow并没有帮助,因为hg不知道重命名。事后是否有任何方法可以手动将文件链接到旧的删除版本,或者是否存在一些像git可以根据hueristics推断移动和重命名的方式?如果有某种方式可以明确地说“这个文件是这个旧的已删除文件的延续。”,即使这仍然需要一些时间来解决这一问题,这将是很好的。

我们几乎已经放弃了历史,但是拥有它真的很棒。

3 个答案:

答案 0 :(得分:13)

您需要通过明确告知Mercurial移动了哪些文件,然后合并损坏的更改集来正确重做移动。这样,您将恢复原始文件的历史路径。

步骤,假设<x>是移动修订版,<y>是当前的头版修订版。

  1. 在移动前更新到修订版:hg update <x-1>
  2. 重做此举,但现在正确使用hg renamehg rename --after
  3. 提交
  4. 与原始移动修订版本(hg merge <x>)合并,这应该没有冲突但是如果丢弃了所有更改。
  5. 提交
  6. 移动后合并剩余的变更集(如果有)(hg merge <y>
  7. 提交
  8. 以下是命令行上显示的基本过程:

    $ 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