【问题标题】:Do version control systems use diffs to store binary files?版本控制系统是否使用差异来存储二进制文件?
【发布时间】:2016-09-16 02:16:23
【问题描述】:

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

如果我有多个数据块(我们称它们为 A、B、C、D 等)并且我有一个二进制文件,在第一次签入时看起来像 ABC,但在第二次签入时已修改为 ADBE ,我的 VCS 是否足够智能以仅存储更改的位,还是会创建文件的全新映像?

【问题讨论】:

标签: git svn version-control


【解决方案1】:

tl;博士

Git 只能存储二进制文件的差异,但效率不高,因此您可能应该使用一些外部工具,例如 lfs

稍微长一点的解释

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

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

【讨论】:

    【解决方案2】:

    我们使用 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 兆字节的文件,而是计算了一个增量。

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

    根据我的总体经验,主要用于代码开发和存储一些相关二进制文件的 SVN 存储库似乎并没有快速增长。很难比较具体情况,但上述存储库已有 8 年历史,由 2 个人全职积极工作,包含 Visual Studio 解决方案和下载库的混合、非源代码开发文件(如图形、构建结果、文档)等,仅增长到 26 GB。该服务器有一个由三个 120 GB 固态硬盘组成的 RAID 5 阵列,我预计它需要多年升级。

    -诺埃尔

    【讨论】:

      【解决方案3】:

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

      相当聪明,有些只是更聪明(但所有商店都发生了变化,而不是全新版本的工件)

      在我前段时间(在 Git 1.7.* 的时候)的肮脏快速测试中,对于相同的测试用例(二进制文件中的相同变化)相同的序列产生略少(a百分之几)SVN-repo,与 Git 相比。

      但是,另一方面:

      Git-LFS 或 Mercurial+LargeFiles 扩展允许将二进制文件(主要是 LARGE)存储在存储库之外(repo 只有指向外部位置的对象的指针),并且两全其美:快速小型 repo和版本控制二进制文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 2016-08-18
        • 1970-01-01
        • 2015-05-29
        • 2012-03-17
        • 2011-10-15
        相关资源
        最近更新 更多