【问题标题】:Does git de-duplicate between files?git会在文件之间进行重复数据删除吗?
【发布时间】:2014-10-28 23:52:43
【问题描述】:

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

【问题讨论】:

  • 让我们把它发挥到极致:假设您提交了几个 no 内容的文件(即完全为空的文件)。在 zlib 压缩之前,此类文件的 git 表示为 blob 0\x00。所有空文件都将具有完全相同的 SHA1 哈希,因此无论您提交的是 1 个还是 1000 个空文件,您的 repo 中都只会有一个这样的 blob。
  • @DavidHammen 确实如此,但仅适用于相同的文件。问题是关于不相同但相似的文件。

标签: git


【解决方案1】:

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

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

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

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

当 Git 打包对象时,它会查找名称和大小相似的文件,并仅存储从一个文件版本到下一个版本的增量。你可以查看包文件,看看 Git 做了什么来节省空间。 git verify-pack 管道命令允许您查看打包的内容 [...]

如果 git 决定对“大文件 A 的打包条目”和“大文件 B 的打包条目”进行 delta-compress,那么——并且只有——git 可以按照您要求的方式节省空间.

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

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

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

这里真正的收获是,你可以简单地尝试一下,使用Pro Git book中列出的方法。

【讨论】:

    【解决方案2】:

    git 会通过只存储文件之间的差异来节省空间吗?

    可以,git可以将pack the files转成压缩格式。

    您的磁盘上有两个几乎相同的 4K 对象。难道不是吗 如果 Git 可以完整存储其中一个对象,然后再存储第二个对象,那就太好了 仅作为它与第一个之间的增量?

    事实证明它可以。 Git 保存的初始格式 磁盘上的对象称为松散对象格式。不过,偶尔 Git 将这些对象中的几个打包到一个名为 一个包文件,以节省空间并提高效率。吉特这样做 如果你周围有太多松散的物体,如果你运行git gc 手动命令,或者如果您推送到远程服务器。看什么 发生这种情况时,您可以通过调用手动要求 Git 打包对象 git gc 命令:

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多