Mercurial 无法通过命令行合并

Posted

技术标签:

【中文标题】Mercurial 无法通过命令行合并【英文标题】:Mercurial fails to merge via command line 【发布时间】:2013-12-07 14:52:55 【问题描述】:

我的 mercurial 安装拒绝通过命令行合并。这是我打开verbosedebug后的输出。

C:\src\***>hg resolve --all --verbose --debug
couldn't find merge tool codecompare_diff
couldn't find merge tool codecompare_merge
couldn't find merge tool bcompare
couldn't find merge tool beyondcompare3
couldn't find merge tool beyondcompare3-noauto
couldn't find merge tool rekisa
couldn't find merge tool UltraCompare
couldn't find merge tool araxis
couldn't find merge tool meld
couldn't find merge tool diffuse
picked tool 'kdiff3' for ***/***.csproj (binary False symlink False)
merging ***/***.csproj
my ***/***.csproj@4f4faeac0fea+ other ***/***.csproj@ae29e8c6bb88 ancestor ***/***.csproj@399376fedfc5
The system cannot find the path specified.
merging ***/***.csproj failed!

注意:合并实际上是成功的(弹出kdiff3,我合并保存),但是mercurial却是一头雾水。

如何确定 Mercurial 找不到哪个 path

我已尝试更新到最新版本 (2.8) 并查看我的 mercurial.ini 是否有任何可疑文件。我还使用了不同的合并工具 p4merge 来达到同样的效果。

【问题讨论】:

也许你应该把它迁移到Meta Stack Overflow,因为它是关于SO的? 这不是关于 SO:而是关于 Mercurial。我正在检查的项目称为 ***,但这与上下文无关 :-) 您在clone 的新包装盒中尝试过吗?似乎是“系统”问题,而不是 Mercurial。 检查 [ui] 部分中的合并定义的 ini 文件(全局和存储库) - 似乎您没有指定 "系统找不到指定的路径。"是来自 Windows 而不是 Mercurial 的消息。您的 kdiff3 工具是否安装在名称中带有空格的目录中?或者也许是 kdiff3 调用的一些工具?也许某处有一个没有“”或其他东西的环境变量?或者可能有一个环境变量指向一个不存在的目录或文件。正如@LazyBadger 建议的那样,检查您的 .ini 文件,但要注意可能不正确的路径。 【参考方案1】:

嗯……其实。

这可能是愚蠢的“解决方案”,但您可以查看 mercurial 附带的 filemerge.py 文件。 该文件定义了 mercurial 如何进行合并(调用外部合并工具、处理结果等)。

您可以在filemerge 函数中看到以下几行:

    ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" %
               (tool, fd, binary, symlink))
    [...]
        ui.status(_("merging %s\n") % fd)

    ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))

他们在您的输出中给出了相应的消息:

picked tool 'kdiff3' for ***/***.csproj (binary False symlink False)
merging ***/***.csproj
my ***/***.csproj@4f4faeac0fea+ other ***/***.csproj@ae29e8c6bb88 ancestor ***/***.csproj@399376fedfc5

然后从filemerge函数调用_xmerge函数,代码如下:

  needcheck, r = func(repo, mynode, orig, fcd, fco, fca, toolconf,
                       (a, b, c, back))

然后ui.warn(onfailure % fd) 到达334 行或368 行(我不知道),这会给出最后一条错误消息:

merging ***/***.csproj failed!

ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))ui.warn(onfailure % fd) 之间的某个地方,实际上达到ui.warn(onfailure % fd) 是有原因的(可能在_xmerge 中)。您可以尝试通过在filemerge.py 文件的各个位置插入各种调试输出并重试合并来发现它。这就是我目前所能推荐的(因为我无法在我的机器上重现你的错误和上下文)。


P.S.:正如 santiagopim 建议的那样,您可能更愿意将 WC 复制到干净的 PC 并安装干净的 mercurial 并在那里重试。因为错误很可能是由一些错误配置引起的。但是,如果您更愿意尝试就地解决问题...

【讨论】:

以上是关于Mercurial 无法通过命令行合并的主要内容,如果未能解决你的问题,请参考以下文章

Mercurial转换扩展无法从远程Git存储库中提取

Mercurial:命令行提交消息

使用 Symfony 和 Apache 在生产环境中运行 Mercure | HTTPS 问题

如何自动删除 Mercurial 工作树中的所有 .orig 文件?

如何在 mercurial TortoiseHg 中从命令行启动工作副本的视觉差异和文件的最后提交

如何在 Mercurial 中重复合并分支