版本控制系统是否使用差异来存储二进制文件?

时间:2016-09-16 02:16:23

标签: git svn version-control

流行版本控制系统(svn,git)如何处理存储二进制文档的修订?我有二进制源的项目,定期更新,需要签入(主要是Photoshop文档,自定义数据格式和一些文字处理文档)。我一直担心检查二进制文件,因为我认为VCS可能只需要一个简单的路径就是每次只上传一个新的二进制副本 - 因此我的存储库会很快变大。

如果我有几个数据块(让我们称之为A,B,C,D等),我有一个二进制文件,在第一次检查时看起来像ABC,但是第二次检入时已被修改为ADBE ,我的VCS是否足够聪明,只能存储更改的位,还是会创建一个全新的文件图像?

3 个答案:

答案 0 :(得分:3)

我们使用CollabNet SubVersion Edge。

我刚刚提交了一个50兆字节的Photoshop .psd文件,我在其中更新了智能过滤器参数。

09/18/2016  05:15 PM        53,015,186 StarSpikesPro4RealismTest.psd

我的SVN存储库大小从:

增长
 Total Files Listed:
       19157 File(s) 26,148,088,902 bytes

 Total Files Listed:
       19159 File(s) 26,152,019,035 bytes

这个小于.psd文件大小的10%,所以很明显整个50兆字节的文件都没有存储,但计算了一个delta。

请记住,某些文件(例如Photoshop图像)本身可能会被相关应用程序压缩,因此存储文件的二进制内容可能与编辑完全不同,因此不会产生良好效果任何系统上的delta性能。但您可以选择在Photoshop中禁用该压缩。这个实际上是在保存时压缩的,但即使启用了这样的压缩,我们也只看到了存储库大小的小幅增长。

根据我的经验,主要用于代码开发和存储某些相关二进制文件的SVN存储库似乎根本没有快速增长。很难比较细节,但上述存储库,8年历史,由2人全职工作,包含Visual Studio解决方案和下载库的混合,非源代码开发文件,如图形,构建结果,文档等,只增长到26千兆字节。该服务器有一个由3个120 GB SSD组成的RAID 5阵列,我预计它不需要多年升级。

-Noel

答案 1 :(得分:2)

TL;博士

Git只能存储二进制文件的差异,但效率不高,所以你可能应该使用lfs之类的外部工具。

稍微长一点的解释

默认情况下,git不会在提交之间存储差异。当您更改某个文件并进行新提交时,git会将 object 存储为整个文件的内容。如果只更改一行或重写整个文件没关系 - git不存储差异,至少在第一个位置。有一个名为git-gc的git(垃圾收集器)负责删除悬空提交和优化等任务,它运行另一个git命令 - git-repack,它完全符合你的要求对于。它需要一大堆对象并使用增量压缩将它们存储在一个包中。

不幸的是,在压缩二进制文件时,使用if ($args ~ "debug=true") { set $args_debug false; return 301 $uri; } 打包并不是特别有效。您可以随时tweak it,但如果您的文件发生了很大变化,或者它们非常大,那么您应该使用一些外部工具,例如lfs

答案 2 :(得分:1)

  

流行版本控制系统(svn,git)如何处理存储二进制文档的修订?

相当聪明,有些只是更智能(但所有商店更改,而不是全新版本的工件)

在我的脏快速测试中(在Git 1.7。*时)对于相同的测试用例(二进制MB的相同变化),相同的序列产生略少(a很少百分比)与Git相比,SVN-repo。

但是,另一方面:

Git-LFS或Mercurial + LargeFiles Extension允许在存储库外存储二进制文件(主要是 LARGE )(repo只有指向外部对象的指针)并且拥有两个世界中最好的:快速小型回购和版本化二进制文件