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

Rob*_*ker 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

这可能吗?

Obe*_*nne 6

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

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

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

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

    $ hg export --git -r <rev-to-graft> > my.patch
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在这个补丁中,替换f1a.txtf1.txt,所以你得到:

    ...
    diff --git a/f1.txt b/f1.txt
    --- a/f1.txt
    +++ b/f1.txt
    @@ -1,1 +1,1 @@
    ...
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 将已编辑的修补程序导入目标修订:

    $ hg up <target-rev>
    $ hg import my.patch
    
    Run Code Online (Sandbox Code Playgroud)