git可以使用基于补丁/差异的存储吗?

时间:2015-08-18 16:02:41

标签: linux git

据我了解,git存储了每个提交的修订版的完整文件。即使它被压缩,也无法与一个原始修订版完整文件存储压缩补丁相提并论。特别是图像等二进制文件难以压缩的问题

有没有办法让git使用基于补丁/差异的后端来存储修订?

我明白为什么git的主要用例会像它那样做,但是我有一个特殊的用例,如果可以的话我想使用git但它会占用太多空间。

由于

1 个答案:

答案 0 :(得分:1)

Git确实在名称" delta compression"下静默地自动使用基于差异的存储。它仅适用于“打包”的文件,并且每次操作后都不会发生打包。

  • git-repack docs:

      

    包是一组对象,单独压缩,应用增量压缩,存储在单个文件中,带有相关的索引文件。

  • Git Internals - Packfiles

      

    磁盘上有两个几乎相同的22K对象。如果Git可以将其中一个完全存储,然后将第二个对象仅作为它与第一个对象之间的差值而不是很好吗?

         

    事实证明它可以。 Git在磁盘上保存对象的初始格式称为“松散”对象格式。但是,偶尔Git会将其中几个对象打包成一个名为“packfile”的二进制文件,以节省空间并提高效率。如果您有太多松散的对象,如果您手动运行git gc命令,或者您推送到远程服务器,Git会执行此操作。

    随后:

      

    关于这一点非常好的是它可以随时重新包装。 Git会偶尔自动重新打包您的数据库,总是试图节省更多空间,但您也可以随时手动运行git gc手动重新打包。

  • "The woes of git gc --aggressive"(Dan Farina),其中描述了增量压缩是对象存储的副产品,而非修订历史记录:

      

    Git不使用您的标准每文件/每次提交前向和/或后向增量链来派生文件。相反,使用任何其他存储版本来派生另一个版本是合法的。与大多数版本控制系统形成对比,其中唯一的选择就是根据最后一个版本计算增量。后一种方法很常见,可能是因为系统倾向于将增量与修订历史相结合。在Git中,开发历史与这些增量没有任何关系(这些增量被安排为最小化空间使用),而历史则被强加在更高的抽象层次上。

    后来,引用Linus,谈到git gc --aggressive抛弃古老的三角洲并用更糟糕的三角洲代替它们的倾向:

      

    相当于" git gc --aggressive" - 但正确 - 完成了   做(过夜)像

    git repack -a -d --depth=250 --window=250