【问题标题】:Can a Mercurial graft cope with renamed filesMercurial 移植可以处理重命名的文件吗
【发布时间】:2012-10-05 20:33:46
【问题描述】:

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

这可能吗?

【问题讨论】:

    标签: mercurial


    【解决方案1】:

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

    我猜这不起作用的基本原因是因为移植明确地只选择一个修订版的更改,即明确不考虑过去的更改(包括文件重命名)(update: 可能是还有一个错误或缺失的功能,请参阅@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
      

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-04
          • 1970-01-01
          • 2012-04-04
          • 2018-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多