当git说它在“解决三角洲问题”时,它到底在做什么呢?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

在存储库的第一个克隆过程中,git首先接收对象(这很明显),然后花费大约相同的时间“解析三角洲”。在克隆的这个阶段到底发生了什么?

提问于
用户回答回答于

git使用Delta编码将一些对象存储在包文件中。但是,你不想重复每一个变化对于给定的文件,为了获得当前版本,Git还偶尔会有文件内容的快照存储。“解析三角洲”是处理确保所有这些保持一致的步骤。

用户回答回答于

各阶段git clone是:

  1. 接收回购数据库中所有对象的“包”文件
  2. 为接收到的包创建索引文件
  3. 检查头部修改(显然,对于一个非裸回购)

“解析三角”是第二阶段的消息,为Package文件(“gitindex-pack”)建立索引。

包文件在其中有实际的对象ID,只有对象内容。因此,要确定对象ID是什么,git必须对包中的每个对象进行解压缩+SHA 1,以生成对象ID,然后将其写入索引文件。

包文件中的对象可以存储为增量,即对其他对象进行的一系列更改。在这种情况下,git需要检索基本对象,应用命令,并使用结果SHA 1。基对象本身可能必须通过应用一系列增量命令来派生。(即使在克隆的情况下,已经遇到了基本对象,但是内存中缓存的人造对象的数量是有限的)。

总之,“解决三角洲”阶段涉及到对整个回购数据库进行解压缩和校验,这并不令人意外地花费了相当长的时间。据推测,解压缩和计算SHA 1比应用增量命令花费更多的时间。

在后续的获取情况下,接收到的包文件可能包含对其他对象的引用(作为增量对象库),而接收GIT应该已经具有这些引用。在这种情况下,接收到的git实际上重写了接收到的包文件,以包含任何这样的引用对象,这样任何贮存包文件是自给自足的.。这可能是“解析三角洲”消息的发源地。

扫码关注云+社区