![](/img/trans.png)
[英]Use the "git diff" command to generate a patch file. After applying the patch file using the "patch" command, the permissions was lost
[英]Can git use patch/diff based storage?
据我了解,git存储每个已提交修订的完整文件。 即使已压缩,也无法与一个原始修订完整文件存储压缩补丁进行竞争。 对于压缩性差的二进制文件(例如图像),这尤其是一个问题。
有没有办法让git使用基于补丁/差异的后端来存储修订?
我知道为什么git的主要用例是这样做的,但是我有一个特殊的用例,如果可以的话,我想使用git,但是会占用太多空间。
谢谢
Git确实以“增量压缩”为名,自动且安静地使用基于差异的存储。 它仅适用于“打包”的文件,打包不会在每次操作后发生。
git-repack文档:
包是对象的集合,这些对象分别进行压缩并应用增量压缩,并与相关的索引文件一起存储在单个文件中。
您的磁盘上有两个几乎相同的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.