繁体   English   中英

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

[英]Can git use patch/diff based storage?

据我了解,git存储每个已提交修订的完整文件。 即使已压缩,也无法与一个原始修订完整文件存储压缩补丁进行竞争。 对于压缩性差的二进制文件(例如图像),这尤其是一个问题。

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

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

谢谢

Git确实以“增量压缩”为名,自动且安静地使用基于差异的存储。 它仅适用于“打包”的文件,打包不会在每次操作后发生。

  • git-repack文档:

    包是对象的集合,这些对象分别进行压缩并应用增量压缩,并与相关的索引文件一起存储在单个文件中。

  • Git内部-Packfiles

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

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

    后来:

    真正的好处是它可以随时重新包装。 Git有时会自动重新打包数据库,总是试图节省更多空间,但是您也可以随时手动运行git gc来手动重新打包。

  • git gc --aggressive (Dan Farina),它描述了增量压缩是对象存储而不是修订历史记录的副产品:

    Git不会使用标准的按文件/按提交的正向和/或反向增量链来派生文件。 相反,使用任何其他存储版本来派生另一个版本是合法的。 将其与大多数版本控制系统进行对比,在大多数版本控制系统中,唯一的选择就是简单地针对上一版本计算增量。 后一种方法之所以如此普遍,可能是由于系统地倾向于将增量与修订历史记录耦合在一起。 在Git中,开发历史记录不以任何方式与这些增量相关联(这些增量被安排为最小化空间使用),而是将历史记录强加于更高的抽象级别。

    后来,引用Linus谈论git gc --aggressive抛弃旧的良好delta并用较差的delta代替的趋势:

    因此,相当于“ git gc --aggressive”(但正确完成)的是(隔夜)做类似

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM