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

cap*_*aig 10 version-control mercurial

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

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

我们已经完全放弃了历史,但是拥有它真的很棒.

Lau*_*lst 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. 承诺

以下是命令行上显示的基本过程:

$ mkdir move-merge-test
$ cd move-merge-test
$ hg init
$ echo "x" > a
$ hg add a
$ hg commit -m "initial revision"
Run Code Online (Sandbox Code Playgroud)

移动不正确:

$ 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
Run Code Online (Sandbox Code Playgroud)

纠正此举:

$ 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
Run Code Online (Sandbox Code Playgroud)

将它与破碎的移动合并:

$ 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
Run Code Online (Sandbox Code Playgroud)

如您所见,历史记录现在可以正确显示所有受影响的变更集.如果文件在多次提交中移动,则基本原则保持不变,只需合并超过1次提交.如果您在移动后进行了任何提交,我建议将它们单独合并(上述步骤中的步骤6)以避免虚假冲突.