Mercurial贪污可以应对重命名的文件

时间:2012-10-05 20:33:47

标签: mercurial

我想使用hg graft将变更集从一个分支复制到另一个分支。

但是,更改集中修改的文件已在源分支中重命名(使用hg rename) - 在我要移植的变更集之前。

当我尝试时,我得到:

scanning for duplicate grafts
grafting revision 3
  searching for copies back to rev 2
  unmatched files in local:
   f1.txt
resolving manifests
 overwrite: False, partial: False
 ancestor: c06936303423, local: cfeaa3003c57+, remote: e3f2a201d1e2
remote changed f1a.txt which local deleted
use (c)hanged version or leave (d)eleted? c

(c)和(d)都不是正确的选择。

文件f1a.txt已从源分支中的f1.txt重命名。 f1a.txt甚至从未存在于目标分支中。

这可能吗?

3 个答案:

答案 0 :(得分:6)

这是一个很好的问题。看起来这是不可能的。我重播了你的场景,并尝试了移植 rebase - 效果相同。

我认为这不起作用的基本原因是因为移植明确地仅选择一个修订的更改,即明确不考虑过去的更改(包括文件重命名)(更新:可能是一个错误或缺失的功能,请参阅@ Soulman的回答)。

你没有要求,但这是一个解决方法..

  1. 获取要移植的变更集的补丁:

    $ hg export --git -r <rev-to-graft> > my.patch
    
  2. 在此修补程序中,将f1a.txt替换为f1.txt,以便获得:

    ...
    diff --git a/f1.txt b/f1.txt
    --- a/f1.txt
    +++ b/f1.txt
    @@ -1,1 +1,1 @@
    ...
    

    Sed是你的朋友:sed -i my.patch -e "s,\([ab]\)/f1a\.txt,\1/f1.txt,g"

  3. 将已编辑的补丁导入目标修订版:

    $ hg up <target-rev>
    $ hg import my.patch
    

答案 1 :(得分:3)

我认为这只是一个有希望修复的错误。有一张票:Graft fails when files have been moved in an ancestor revision

答案 2 :(得分:1)

重命名是删除+添加+说明将旧文件的历史记录视为新文件的历史记录。在进行移植时(通过复制相同的更改来创建新的变更集而不创建关系而不是合并),您必须将变更集的更改合并到一起。在这种情况下,您只能移植“添加”操作,或者决定不添加文件(将其删除)。我很遗憾地说,在这种情况下根本不可能移植重命名,因为如果另一个分支没有该文件则没有意义。

对不起,如果我不正确理解你所处的情况。如果是这样的话,请举例说明。 (几乎没有设置虚拟仓库的命令,可以重现你的情况)。