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

Arp*_*wal 3 git github

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

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

在此输入图像描述

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

在此输入图像描述

如果我转到对象文件夹并搜索具有哈希值前两个字符的文件夹,我将无法找到该文件夹​​。

在此输入图像描述

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

在此输入图像描述

我也尝试从树的 cat 文件中查找文件(blob),但在对象文件夹中找不到带有哈希值的文件。谁能帮我理解为什么?

Obs*_*ian 7

你应该看看:

\n
.git/objects/pack\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 也是。

\n

Git 确实使用你描述的对象系统,但最终,当它们太多时,Git 会让垃圾收集器负责打包它们,即收集其中一些然后将它们连接到一个文件中(不压缩,不过,因为对象已经被压缩。因此它们可以在包文件的中间直接访问)。除此之外,还创建了一个索引文件“* .idx ”以便快速检索它们。

\n

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

\n

请参阅:Git 内部结构:打包文件

\n

  • 附带说明一下:打包文件中的对象都像解压缩的对象一样被压缩,*和*增量编码(相对于彼此的解压缩副本)。增量压缩是消耗 CPU 时间最多的部分,因为 Git 必须花费大量精力来查找彼此压缩良好的对象,并选择可实现良好压缩的增量链顺序和长度。 (2认同)