如何将 Mercurial 中的旧版本文件复制到提示处的新位置?

How to copy old version of file in mercurial to new location at tip?

有一个 C++ class,其 .cpp 已在多次提交中进行了大量修改。现在事实证明,我们实际上想要一个层次结构,当前的实现保持不变,并且对原始实现进行不同的更改并采用新名称。

我如何才能将原始名称复制到新名称,同时保留其历史记录并且不破坏我所做的更改?

我的第一个想法是将文件复制到一个分支中,然后将该分支合并到 head 中,但是 mercurial 太聪明了,它试图将所有更改应用到副本中作为合并的一部分,从而导致大量冲突。

我应该用不同的方法来解决这个问题吗?我不知道为什么在复制文件后对文件所做的反复无常的更改应该应用于副本...

重现 bash 中问题的示例:

mkdir tmp
cd tmp
hg init
echo hi > foo
hg add foo
hg commit
echo -e 'ho\nhi\nha' > foo
hg commit
hg up -r0
hg cp foo bar
echo 'howdy' >> bar
hg ci
hg up -r1
hg merge -r2 
# unexpected merge conflicts

无需分支合并:

hg revert -rOLDREV FILENAME
hg cp FILENAME NEW_NAME
hg revert FILENAME

其中 OLDREV 是您要复制到的文件 FILENAME 的修订版 NEW_NAME。

您可以使用您的分支方法,然后执行

hg revert -r 2 --all 

处理所有冲突。