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 甚至从未存在于目标分支中。

这可能吗?

4

3 回答 3

6

This is an excellent question. It looks like it is not possible. I replayed your scenario and also tried transplant and rebase -- with the same effect.

I guess the basic reason why this does not work is because a graft explicitly only picks the changes of one revision, i.e. past changes (including file renames) explicitly are not considered (update: could be a bug or missing feature as well, see @Soulman's answer).

You did not ask for, but here's a work around ..

  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
    
于 2012-10-08T18:47:21.543 回答
4

我认为这只是一个有望修复的错误。有一张票:当文件在祖先版本中移动时,嫁接失败

于 2014-02-26T13:04:27.677 回答
1

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

对不起,如果我没有正确理解您所处的情况。如果是这样,请提供一个例子。(很少有命令可以设置一个虚拟仓库,它可以重现您的案例)。

于 2012-10-08T18:02:33.137 回答