据我了解,git存储了每个提交的修订版的完整文件。即使它被压缩,也无法与一个原始修订版完整文件存储压缩补丁相提并论。特别是图像等二进制文件难以压缩的问题
有没有办法让git使用基于补丁/差异的后端来存储修订?
我明白为什么git的主要用例会像它那样做,但是我有一个特殊的用例,如果可以的话我想使用git但它会占用太多空间。
由于
答案 0 :(得分:1)
Git确实在名称" delta compression"下静默地自动使用基于差异的存储。它仅适用于“打包”的文件,并且每次操作后都不会发生打包。
git-repack docs:
包是一组对象,单独压缩,应用增量压缩,存储在单个文件中,带有相关的索引文件。
磁盘上有两个几乎相同的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