当项目树包含二进制文件时,GIT、Mercurial、SVN或其他版本控制工具能否正常工作?

10
有时候我们的项目树会有二进制文件,比如jpg、png、doc、xls或pdf。GIT、Mercurial、SVN或其他工具在只更改二进制文件的一部分时能否良好地执行任务?例如,如果规范书写在.doc中并且是仓库的一部分,那么如果它有4MB,在一年内被编辑了100次但只有1或2行更改,然后在检入100次之后,它就会成为400MB。如果它是100个不同的.doc和.xls文件,那么它就是40GB……这不是一个容易管理的大小。我尝试过GIT和Mercurial,并发现它们似乎即使在.doc或.pdf中只更改了一行,也会添加大量数据。在GIT、Mercurial或SVN内部是否有其他方法可以完成这项工作? P.S. 我尝试过Dropbox,我可以有一个7MB的文件,然后我在.PDF文件中突出显示了几个地方,Dropbox似乎能够上传1秒钟的更改。我的上行速度只有200kb/s,所以我认为Dropbox做了一个相当不错的差异。因此,我们可以使用Dropbox,只是这种方式没有版本控制。
5个回答

13

通常情况下,版本控制系统更适用于文本文件。整个合并/冲突的概念基本上都是围绕着源代码展开的。但是,SVN对于二进制文件也可以很好地工作。(我们使用它来对CAD图纸进行版本控制)

我要指出的是,当有多人同时处理共同的二进制文件时,文件锁定(svn:needs-lock)几乎是必须的。没有文件锁定,两个人可能会同时对一个二进制文件进行处理。某人先提交了他们的更改。那么,还没有提交的人会发生什么呢?他们所做的所有二进制/无法合并的工作实际上都会丢失。文件锁定使得对文件的工作变为串行处理。虽然您失去了版本控制系统的“并发”访问功能,但您仍然可以享受提交日志、恢复到先前版本等好处。

TortoiseSVN客户端足够智能,可以使用MS Word内置的合并工具来比较doc/docx文件。它还具有配置选项,可以让您根据文件扩展名指定其他差异工具,这非常棒。(遗憾的是,我们的CAD软件包中没有人制作差异工具)

像Git或Hg这样的当前一代DVCS对于二进制文件来说往往不太好用。它们没有任何文件锁定机制。


5
存在二进制差异工具,但它们并没有多大帮助,因为图像中一个像素的改变或 Word 文档中一个字符的更改,并不对应文件中一个字节的更改,由于压缩,因此无法“很好地”处理此类二进制数据。
如果您想提交此类文档,请考虑提交未经压缩的版本 - RTF 而不是 DOC,TeX 而不是 PDF 等。如果版本控制系统使用压缩来压缩其内部存储库,则此方法应该相当有效。例如,在Git中:
“新添加的对象使用 zlib 压缩以完整形式存储。”
编辑:我只想指出,即使是 RTF 也很糟糕,但不像 DOC 那么糟糕。如果您可以将文档切换到 TXT 或 TeX,则最好。

Postscript是TeX的另一种选择。正如另一个答案中所指出的,Word也可以将文件保存为XML格式,这样就可以进行差异比较。 - Matthew Talbert

3
请参考Mercurial关于二进制文件的Wiki页面。你面临的主要问题是,即使是文档等文件的微小更改也会引发文件结构的巨大变化(部分原因是它被压缩了)。
因此,我认为在版本控制系统中处理这些文件没有好的方法。

1
这是一个有效的观点:最好配置Word、Excel和Openoffice默认保存在它们“臃肿”的基于xml的格式中,因为这样SCM更容易检测到差异。 - Peter Tillemans
1
@Peter Tillemans:至少使用git是可以设置钩子在提交之前运行tidy来清理XML数据的,这可能会增加减少差异的机会。尽管在Windows下可能需要安装cygwin才能获得tidy。这还假设MS格式足够一致,以便在它们被清理后可以读取它们。 - intuited

3
我一直在使用git来在Mac、Linux和Windows机器之间同步我的文档。我不得不进行一次重新设计,以避免Windows上的2GB文件限制。总共有3个仓库,大小约为7GB,并且定期同步。在某个时候,我甚至在互联网上的托管服务器上有一个远程副本。
现在我几乎不需要克隆这些仓库,因此它们的大尺寸并不会对我造成太多阻碍。我还看到.git文件没有显著增加,仍然保持在已检出文档、PDF、Excel表格大小的40-60%左右。
更改文档或PDF文件中的一行将导致许多格式效果连锁反应式地发生变化。同样,更改XLS文件中的一个单元格可能会影响许多其他单元格。
然而,与不将文档纳入版本控制的替代方案相比,我很高兴接受不那么出色的压缩比率。

1

在我看来,你应该停止使用SCM来管理这些文档。你应该使用专门的工具,比如Alfresco(我相信还有许多其他文档管理工具可供选择)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接