.git对象文件夹中缺少哈希

时间:2019-06-16 10:32:34

标签: git github

我正在研究git工作原理的内部。我在读git将所有内容存储在objects文件夹中。它首先对文件进行SHA1哈希处理并将其存储在对象文件夹中。我在存储库中的1个上尝试了以下命令,但是在对象目录中找不到哈希文件,但是使用cat-file命令,可以看到该命令。有什么我想念的。以下是我要理解的步骤。

我做了git log来查找最新的提交,

enter image description here

然后我将提交的提交ID归档,并可以看到树文件的哈希值。

enter image description here

如果我转到对象文件夹并用哈希的第一个两个字符搜索该文件夹,我将找不到该文件夹​​。

enter image description here

但是我仍然能够获取文件。

enter image description here

我也尝试了从树的cat文件中获取文件(blob),但是在objects文件夹中找不到带有哈希的文件。谁能帮我理解为什么?

1 个答案:

答案 0 :(得分:2)

您应该看一下:

.git/objects/pack

...也是。

Git确实使用了您描述的对象系统,但是最终,当它们过多时,Git将由垃圾收集器负责包装,即收集其中的一部分,然后将它们串联在一起。单个文件(但是,由于对象已经被压缩,因此不进行压缩。因此,可以在打包文件的中间直接访问它们)。除此之外,还创建了索引文件“ *。idx ”,以便快速检索它们。

这既可以清除有用的索引节点,也可以清除文件系统上每个文件最后一个块的末尾剩余的空间,但是该操作需要时间和资源。这就是为什么Git仅在特定时间触发此操作的原因。

请参阅:Git Internals: Pack Files