在仓库的第一次克隆过程中,git首先接收对象,然后花费大约相同的时间来“解决增量”。克隆的这个阶段到底发生了什么?
aelbi1ox1#
git clone的阶段是:1.接收存储库数据库中所有对象的“包”文件1.为收到的包创建索引文件1.检查头部修订(显然,对于非裸回购)“Resolving deltas”是第二阶段显示的消息,索引包文件(“git index-pack”)。包文件中 * 没有 * 实际的对象ID,只有对象内容。因此,为了确定对象ID是什么,git必须对包中的每个对象进行解压缩+SHA1,以生成对象ID,然后将其写入索引文件。包文件中的对象可以存储为增量,即对其他对象所做的一系列更改。在这种情况下,git需要检索基本对象,应用命令并对结果进行SHA1。基对象本身可能必须通过应用一系列delta命令来派生。(即使在克隆的情况下,基本对象将已经被遇到,但在内存中缓存的制造对象的数量是有限的)。总而言之,“解析增量”阶段包括对整个repo数据库进行解压缩和校验和,这将花费相当长的时间。据推测,解压缩和计算SHA1实际上比应用delta命令需要更多的时间。在后续获取的情况下,接收到的包文件可能包含对接收git预期已经具有的其他对象的引用(作为增量对象库)。在这种情况下,接收的git实际上重写了接收到的包文件,以包含任何此类引用的对象,因此任何 * 存储的 * 包文件都是自给自足的。这可能是消息“解决增量”的起源。
git clone
mitkmikd2#
Git使用delta encoding将一些对象存储在packfiles中。但是,你不想为了得到当前版本而必须回放给定文件上的每一次更改,所以Git也会偶尔存储文件内容的快照。“解决增量”是处理确保所有这些保持一致的步骤。Here's a chapter来自Pro Git书籍的“Git Internals”部分,该书籍可在线获得,其中谈到了这一点。
f4t66c6m3#
Amber似乎在描述Mercurial或类似程序使用的对象模型。Git并不存储对象后续版本之间的增量,而是每次都存储对象的完整快照。然后,它使用增量压缩来压缩这些快照,尝试找到要使用的良好增量,而不管这些增量存在于历史记录的何处。
3条答案
按热度按时间aelbi1ox1#
git clone
的阶段是:1.接收存储库数据库中所有对象的“包”文件
1.为收到的包创建索引文件
1.检查头部修订(显然,对于非裸回购)
“Resolving deltas”是第二阶段显示的消息,索引包文件(“git index-pack”)。
包文件中 * 没有 * 实际的对象ID,只有对象内容。因此,为了确定对象ID是什么,git必须对包中的每个对象进行解压缩+SHA1,以生成对象ID,然后将其写入索引文件。
包文件中的对象可以存储为增量,即对其他对象所做的一系列更改。在这种情况下,git需要检索基本对象,应用命令并对结果进行SHA1。基对象本身可能必须通过应用一系列delta命令来派生。(即使在克隆的情况下,基本对象将已经被遇到,但在内存中缓存的制造对象的数量是有限的)。
总而言之,“解析增量”阶段包括对整个repo数据库进行解压缩和校验和,这将花费相当长的时间。据推测,解压缩和计算SHA1实际上比应用delta命令需要更多的时间。
在后续获取的情况下,接收到的包文件可能包含对接收git预期已经具有的其他对象的引用(作为增量对象库)。在这种情况下,接收的git实际上重写了接收到的包文件,以包含任何此类引用的对象,因此任何 * 存储的 * 包文件都是自给自足的。这可能是消息“解决增量”的起源。
mitkmikd2#
Git使用delta encoding将一些对象存储在packfiles中。但是,你不想为了得到当前版本而必须回放给定文件上的每一次更改,所以Git也会偶尔存储文件内容的快照。“解决增量”是处理确保所有这些保持一致的步骤。
Here's a chapter来自Pro Git书籍的“Git Internals”部分,该书籍可在线获得,其中谈到了这一点。
f4t66c6m3#
Amber似乎在描述Mercurial或类似程序使用的对象模型。Git并不存储对象后续版本之间的增量,而是每次都存储对象的完整快照。然后,它使用增量压缩来压缩这些快照,尝试找到要使用的良好增量,而不管这些增量存在于历史记录的何处。