gpt4 book ai didi

git - git 是否在文件之间进行重复数据删除?

转载 作者:行者123 更新时间:2023-12-01 08:02:38 24 4
gpt4 key购买 nike

如果我的存储库包含相同文件的多个副本,只有很小的更改(不要问为什么),git 会通过仅存储文件之间的差异来节省空间吗?

最佳答案

可以,但很难说是否会。在某些情况下,它可以保证不会。

要理解这个答案(及其局限性),我们必须查看 git 存储对象的方式。在 this stackoverflow answer 中对“git 对象”(存储在 .git/objects/ 中)的格式有很好的描述。或在 Pro Git book .

当像这样存储“松散对象”时——git 为我们可能称之为“事件”对象所做的事情——它们被 zlib 压缩,正如 Pro Git 书所说,但没有以其他方式压缩。因此,存储在两个不同对象中的两个不同(不是逐位相同)文件永远不会相互压缩。

另一方面,最终对象可以“打包”到“打包文件”中。查看 Pro Git book 的另一部分有关包文件的信息。存储在包文件中的对象针对同一文件中的其他对象进行“增量压缩”。确切地说,git 用于选择哪些对象针对哪些其他对象进行压缩的标准是相当模糊的。这是 Pro Git Book 中的一个片段:

When Git packs objects, it looks for files that are named and sized similarly, and stores just the deltas from one version of the file to the next. You can look into the packfile and see what Git did to save space. The git verify-pack plumbing command allows you to see what was packed up [...]



如果 git 决定对“大文件 A 的打包条目”与“大文件 B 的打包条目”进行增量压缩,那么 - 只有这样 - git 才能按照您要求的方式节省空间。

Git 每次都会打包文件 git gc运行(或更准确地说,通过 git pack-objectsgit repack ;更高级别的操作,包括 git gc ,在需要/适当时为您运行这些)。此时,git 会收集松散的对象,和/或分解并重新打包现有的包。如果此时您的接近但不完全相同的文件被相互压缩,您可能会看到一些非常大的空间节省。

但是,如果您随后修改文件,您将在工作树中处理扩展和未压缩版本,然后 git add结果。这将创建一个新的“松散对象”,并且根据定义,它不会针对任何东西(没有其他松散对象,也没有任何包)进行增量压缩。

当您克隆存储库时,git 通常会从要传输的对象中制作包(甚至是“瘦包”,它们是非独立的包),以便通过 Intertubes 发送的内容尽可能小。因此,即使源存储库中的对象松散,您也可以获得增量压缩的好处。同样,一旦您开始处理这些文件(将它们变成松散对象),您就会失去好处,并且只有当松散对象再次打包并且 git 的启发式方法将它们相互压缩时才能重新获得它。

这里真正的要点是要找出答案,您可以简单地尝试一下,使用 Pro Git book 中概述的方法。 .

关于git - git 是否在文件之间进行重复数据删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25661952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com