Mercurial嫁接功能是否能处理重命名的文件?

6

我想使用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个回答

6
这是一个很好的问题。看起来似乎不可能实现。我重现了你的场景,并尝试了“移植”和“变基”,但效果相同。我猜这种方法无法实现的基本原因是嫁接版本只选择一个修订版本的更改,即过去的更改(包括文件重命名)并未明确考虑。(更新:也可能是一个错误或缺失的功能,参见@Soulman的回答)。虽然你并没有问,但下面有一个解决方法...
  1. Get a patch of the changeset you want to graft:

    $ hg export --git -r <rev-to-graft> > my.patch
    
  2. In this patch, replace f1a.txt with f1.txt, so you get:

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

    Sed is your friend here: sed -i my.patch -e "s,\([ab]\)/f1a\.txt,\1/f1.txt,g"

  3. Import the edited patch to the target revision:

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

4

1
重命名是删除+添加+注释,说明将旧文件的历史记录视为新文件的历史记录。在进行嫁接(即通过复制相同的更改而不创建关系来创建新的变更集,与合并相反)时,您必须以某种方式合并变更集的更改。在这种情况下,您只能嫁接“添加”操作,或者决定不添加该文件(将其保留为已删除状态)。很抱歉,在这种情况下,基本上不可能嫁接重命名,因为如果其他分支没有该文件,则没有意义。
如果我没有正确理解您所处的情况,我很抱歉。如果是这种情况,请提供一个示例。(设置一个虚拟存储库的几个命令就可以复制您的情况)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接