我正在研究git工作原理的内部。我在读git将所有内容存储在objects文件夹中。它首先对文件进行SHA1哈希处理并将其存储在对象文件夹中。我在存储库中的1个上尝试了以下命令,但是在对象目录中找不到哈希文件,但是使用cat-file
命令,可以看到该命令。有什么我想念的。以下是我要理解的步骤。
我做了git log来查找最新的提交,
然后我将提交的提交ID归档,并可以看到树文件的哈希值。
如果我转到对象文件夹并用哈希的第一个两个字符搜索该文件夹,我将找不到该文件夹。
但是我仍然能够获取文件。
我也尝试了从树的cat文件中获取文件(blob),但是在objects文件夹中找不到带有哈希的文件。谁能帮我理解为什么?
答案 0 :(得分:2)
您应该看一下:
.git/objects/pack
...也是。
Git确实使用了您描述的对象系统,但是最终,当它们过多时,Git将由垃圾收集器负责包装,即收集其中的一部分,然后将它们串联在一起。单个文件(但是,由于对象已经被压缩,因此不进行压缩。因此,可以在打包文件的中间直接访问它们)。除此之外,还创建了索引文件“ *。idx ”,以便快速检索它们。
这既可以清除有用的索引节点,也可以清除文件系统上每个文件最后一个块的末尾剩余的空间,但是该操作需要时间和资源。这就是为什么Git仅在特定时间触发此操作的原因。