当它说“解决三angular洲”时,git究竟在做什么?

在存储库的第一个克隆期间,git首先接收对象(这足够明显),然后花费大约相同的时间“解决变化”。 在这个克隆阶段实际发生了什么?

Git使用增量编码来将一些对象存储在包文件中。 但是,为了获得当前版本,您不希望在给定的文件上回放每一次更改,所以Git也会偶尔存储文件内容的快照。 “解决三angular洲问题”是确保所有这些保持一致的步骤。

下面是 Pro Git书籍的“Git内部”章节,可以在线获得,该章节讨论了这个问题。

git clone的阶段是:

  1. 接收回购数据库中所有对象的“包”文件
  2. 为收到的包创build一个索引文件
  3. 看看头版本(显然,非裸回购)

“parsing三angular洲”是第二阶段显示的消息,索引包文件(“git index-pack”)。

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

一个包文件中的一个对象可能被存储为一个delta,也就是一些其他对象的变化序列。 在这种情况下,git需要检索基础对象,应用命令和SHA1结果。 基本对象本身可能必须通过应用一系列delta命令来派生。 (即使在克隆的情况下,已经遇到了基础对象,但是有多less制造的对象被caching在内存中是有限制的)。

总而言之,“解决三angular洲”阶段涉及对整个回购数据库进行解压和校验,这并不奇怪需要相当长的时间。 推测解压缩和计算SHA1实际上比使用delta命令需要更多的时间。

在后续提取的情况下,接收到的包文件可能包含对接收git预期已经具有的其他对象的引用(作为delta对象库)。 在这种情况下,接收git实际上会重写接收到的包文件以包含任何这样的被引用的对象,这样任何存储的包文件都是自给自足的。 这可能是消息“解决三angular洲”的起源。

琥珀似乎正在描述Mercurial或类似用途的对象模型。 Git不会在对象的后续版本之间存储增量,而是每次都存储对象的完整快照。 然后使用增量压缩来压缩这些快照,试图find使用的好的增量,而不pipe它们在历史中存在的位置。