我们的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无法合并我的文件?
答案 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
选项为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
工具失败时才会调用它,这通常只适用于二进制文件。我将这些行添加到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
合并工具。