代码之家  ›  专栏  ›  技术社区  ›  MikeJansen

磁盘上确实需要git包文件吗?

git
  •  2
  • MikeJansen  · 技术社区  · 5 年前

    据我所知,git SHA1哈希具有通过不复制相同对象来减少磁盘存储的副作用,并且引入了zlib压缩来显式减少存储库的磁盘存储。后来添加了包,引入了增量以进一步减小大小,并将多个对象分组到一个文件中,以改善网络传输。

    我了解到,引入增量可以进一步减小大小,将对象分组到一个文件中可能会对网络产生一些改进。

    但是,将文件分组到一个包文件中真的有必要吗 在磁盘上 ?我不确定这有什么好处,而且似乎在垃圾回收过程中可能会导致性能问题,因为可能需要重写大文件,因为对象的修剪(我知道先放大文件会在一定程度上缓解这种情况)。

    我只是没有看到将对象实际分组到包文件中的好处。 是为了减少在协商需要传输哪些对象时的喋喋不休吗?如果是这样的话,.idx文件似乎可以“定义”一个虚拟包,但将实际对象单独保留在磁盘上,仅在传输时“打包”它们。

    我主要想更好地了解包文件及其原因。我一直在和一位同事一起工作,他有一个有问题的存储库,理解包文件可以帮助我帮助他。

    澄清:我的主要问题不是“为什么包文件有用”,而是:将单个对象存储在一个包文件中,而不是让索引只指向单个文件,有什么好处?有什么好处?我只看到了在修剪对象时必须重写包文件的缺点。我完全受益于三角洲。

    更多信息:

    深入了解包文件的工作原理及其原因:

    1. 包文件主要针对网络传输进行了优化, 减少所传输数据的总大小。这似乎 成为设计决策背后的驱动力。
    2. 为了重建对象, 每一个 必须搜索包文件 直到找到对象ID/哈希。
    3. 索引文件的结构允许快速二分查找 索引和包文件结构允许快速查找基础和增量
    4. 包文件是自包含的,这意味着特定的包文件必须包含 基本文件和构造单个对象所需的任何增量

    所以我看到的是:

    1. 需要搜索的索引文件越少,对象的速度就越快 建立
    2. 在单个操作系统文件中包含相关对象的基础和所有增量 通过只打开一个文件来提高重新创建对象的性能 (实际数据)
    3. 通过网络传输的每个比特和字节都很重要

    通过这一切,我意识到我主要关心的是磁盘上包文件的大小。通常,无论是从备份/还原的角度还是从内容修改的角度来看,处理超大的磁盘文件都更加困难。

    根据我的理解,我观察到的上述3点并不需要将尽可能多的对象放入一个实际的.pack文件中。我看到了在.idx文件中尽可能多的条目可以加快查找对象的好处,但我预感到.pack文件可以存储为多个较小的文件,并且仍然可以实现网络和磁盘性能目标。即使是像每个库一个包文件这样简单的方案,也是增量树。现有的索引方案仍然可以将这些分组在一起,并保持现有的包结构进行传输。

    不管怎样,我想我已经通过更多的研究回答了我最初的问题,但已经揭示了我实际上在脑海中咀嚼的东西,现在它更接近于假设的领域。

    2 回复  |  直到 5 年前
        1
  •  1
  •   Acorn    5 年前

    一般来说,将许多小文件组合成一个大文件通常会提高压缩比,因为您通常可以在其中找到共享模式。

    它还可以帮助减少大量的系统调用开销,这有助于提高性能,特别是在某些操作系统中。

        2
  •  1
  •   kostix    5 年前

    没有包文件,Git根本不会存储增量。如果你在一次提交中有一个100Kb的文件,那么创建一个新的提交,更改该文件中的一个字节,即提交 完整地存储100Kb文件。 git show 只需将提交“呈现”为与父级的差异。

    打包文件 字面意思 用实际的diff替换复制文件,这意味着签出需要重建文件,而不是简单地将其从存储库复制到工作目录中。

        3
  •  1
  •   jthill    5 年前

    文件具有恒定的存储开销。它已经尽可能地减少了,所以无论在何种程度上它都是不可忽视的,这是必要的,所以没有人太担心它。它通常至少有数百个字节。打开文件也有成本——必须读取元数据,必须检查权限,必须维护当前的读取位置。无论是哪种情况,就单个对象的规模和增量压缩给你带来的好处而言,都是一个非常沉重的代价,远远超过了小对象的任何压缩优势,我在这里并不想详尽无遗,也不想描绘一幅全貌。