为什么Mercurial不会将我的XML文件与Beyond Compare合并?

时间:2011-08-19 00:31:30

标签: xml mercurial merge binaryfiles beyondcompare3

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

我发现Mercurial thinks any file with a NULL byte in it is binary,和我们的一些XML文件编码为UTF-16,因此包含很多NULL字节。 我的默认合并工具是Beyond Compare ,它可以处理UTF-16编码的文件。我已经配置了Mercurial as recommended on the Beyond Compare website,但在合并期间,Mercurial说:

  

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

是什么给出的? 为什么Mercurial认为Beyond Compare无法合并我的文件?

1 个答案:

答案 0 :(得分: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选项为Falsebinary=True时,它告诉Mercurial该工具可以合并二进制文件。然而,当我打开该选项时,Mercurial仍然不会让Beyond Compare合并XML文件。

更多的研究提出了premerge选项。 premerge=True时,Mercurial会在内部合并第一个,并且仅在存在要解决的冲突时使用合并工具。不幸的是,Mercurial始终无法合并二进制文件。当合并失败时,Mercurial会停止该文件的合并,并且永远不会启动合并工具。

然后,解决方案似乎也将premerge选项设置为False。不幸的是,预合并非常有用,因为90%的时间没有任何冲突,也从未见过你的合并工具。将premerge设置为False时,每次需要合并时,Beyond Compare都会打开。这非常繁琐。

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

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合并工具。