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

问题描述 投票:4回答:3

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

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

git svn version-control
3个回答
2
投票

tl;dr

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

Slightly longer explanation

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

不幸的是,在压缩二进制文件时,使用git-repack打包并不是特别有效。你可以随时tweak it,但如果你的文件变化很大,或者它们真的很大,你应该使用像lfs这样的外部工具。


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图像)本身可能会被其关联的应用程序压缩,因此存储文件的二进制内容可能与编辑编辑完全不同,因此不会在任何系统上产生良好的增量性能。但您可以选择在Photoshop中禁用该压缩。这个实际上是在保存时压缩的,但即使启用了这样的压缩,我们也只看到了存储库大小的小幅增长。

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

-Noel


1
投票

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

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

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

但另一方面:

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

© www.soinside.com 2019 - 2024. All rights reserved.