2

我们的 Mercurial 存储库中有一堆 XML 文件。当我们将这些文件中的更改从一个分支合并到另一个分支时,Mercurial 抱怨我们的一些 XML 文件是二进制文件,并要求我在文件的本地版本和其他版本之间进行选择。

我发现Mercurial 认为任何包含 NULL 字节的文件都是二进制文件,并且我们的一些 XML 文件被编码为 UTF-16,因此包含很多 NULL 字节。 我的默认合并工具是 Beyond Compare,它可以处理 UTF-16 编码的文件。我已经按照 Beyond Compare 网站上的建议配置了 Mercurial ,但在合并期间,Mercurial 说:

工具 bcomp 无法处理二进制文件

是什么赋予了? 为什么 Mercurial 认为 Beyond Compare 无法合并我的文件?

4

1 回答 1

5

将 Beyond Compare 用作合并程序的推荐 Mercurial 配置如下所示:

[merge-tools]
bcomp.executable = C:\Program Files\Beyond Compare 3\BComp.exe
bcomp.args = $local $other $base $output
bcomp.priority = 1
bcomp.premerge = True
bcomp.gui = True

[ui]
merge = bcomp

根据Mercurial docs on merge tools,默认情况下有一个binary选项False当 时binary=True,它告诉 Mercurial 该工具可以合并二进制文件。 然而,当我打开该选项时,Mercurial 仍然不会让 Beyond Compare 合并 XML 文件。

更多的研究会出现这个premerge选项。 premerge=True,Mercurial内部合并,只有在有冲突需要解决时才使用合并工具。 不幸的是,Mercurial 总是无法合并二进制文件。当预合并失败时,Mercurial 会停止对该文件的合并,并且永远不会启动合并工具。

那么,解决方案似乎也将premerge选项设置为False. 不幸的是,预合并非常有用,因为在 90% 的情况下,没有任何冲突,并且永远不会看到您的合并工具。将 premerge 设置为False,每次需要合并时,Beyond Compare 都会打开。这变得非常乏味。

为了解决这个问题,我创建了第二个 Beyond Compare 合并工具配置,用于合并二进制文件。我将其优先级设置为低于默认bcomp工具,因此仅在主bcomp工具失败时才调用它,这通常仅适用于二进制文件。我将这些行添加到merge-tools我的 mercurial.ini 文件的部分:

bcompbin.executable = C:\Program Files (x86)\Beyond Compare 3\BCompare.exe
bcompbin.args = $local $other $base $output
bcompbin.gui = True
bcompbin.premerge = False
bcompbin.binary = True

这样做的副作用之一是 Beyond Compare 将启动以合并它无法处理的二进制文件。我还没遇到过这种情况,不知道怎么处理。我可能只是暂时注释掉我的bcompbin合并工具。

于 2011-08-19T00:54:41.180 回答