我们的Mercurial存储库中有一堆XML文件。当我们将这些文件中的更改从一个分支合并到另一个分支时,Mercurial抱怨我们的一些XML文件是二进制的,并要求我在文件的本地和其他版本之间进行选择。
我发现Mercurial认为任何包含NULL字节的文件都是二进制文件,并且我们的一些XML文件被编码为UTF-16,因此包含大量NULL字节。我的默认合并工具是Beyond Compare,它可以处理UTF-16编码的文件。我按照Beyond Compare网站上的建议配置了Mercurial,但是在合并时,Mercurial显示:
工具bcomp不能处理二进制
给了什么?为什么水星认为超越比较不能合并我的文件?
使用Beyond Compare作为合并程序的推荐Mercurial配置如下:
[merge-tools]
bcomp.executable = C:Program FilesBeyond Compare 3BComp.exe
bcomp.args = $local $other $base $output
bcomp.priority = 1
bcomp.premerge = True
bcomp.gui = True
[ui]
merge = bcomp
根据Mercurial关于合并工具的文档,有一个默认为False
的binary
选项。当binary=True
时,它告诉Mercurial工具可以合并二进制文件。但是,当我打开该选项时,Mercurial仍然不会让Beyond Compare合并XML文件。
更多的研究发现了premerge
选项。当premerge=True
时,Mercurial首先在内部合并,并且仅在存在要解决的冲突时才使用合并工具。不幸的是,Mercurial总是无法合并二进制文件。当预合并失败时,Mercurial将停止该文件的合并,并且永远不会启动合并工具。
解决方案似乎是,然后,也将premerge
选项设置为False
。不幸的是,预合并是非常有用的,因为90%的时间,没有任何冲突,永远不会看到您的合并工具。如果premerge设置为False
,每次需要合并时,Beyond Compare就会打开。这很乏味。
bcomp
工具低,所以只有当主bcomp
工具失败时才会调用它,这通常只适用于二进制文件。我将这些行添加到mercurial.ini文件的merge-tools
部分:
bcompbin.executable = C:Program Files (x86)Beyond Compare 3BCompare.exe
bcompbin.args = $local $other $base $output
bcompbin.gui = True
bcompbin.premerge = False
bcompbin.binary = True
这样做的一个副作用是Beyond Compare将启动合并它无法处理的二进制文件。我还没有遇到过这种情况,所以不知道该如何处理。我可能只是暂时注释我的bcompbin
合并工具。