.git对象文件夹中缺少哈希
我正在浏览git的内部工作原理。我读到git将所有内容存储在objects文件夹中。它首先对文件进行SHA1散列,并将其存储在对象文件夹中。我在我的存储库的1上尝试了以下命令,但在objects目录中找不到哈希文件,但使用.git对象文件夹中缺少哈希,git,github,Git,Github,我正在浏览git的内部工作原理。我读到git将所有内容存储在objects文件夹中。它首先对文件进行SHA1散列,并将其存储在对象文件夹中。我在我的存储库的1上尝试了以下命令,但在objects目录中找不到哈希文件,但使用cat file命令,我可以看到该命令。有什么我不知道的吗。以下是我理解的步骤 我做了git日志以查找最新的提交 然后,我cat文件中提到的提交id,可以看到树文件的散列 如果我转到“对象”文件夹并搜索哈希值前两个字符的文件夹,则无法找到该文件夹 但我还是能拿到文件 我
cat file
命令,我可以看到该命令。有什么我不知道的吗。以下是我理解的步骤
我做了git日志以查找最新的提交
然后,我cat文件中提到的提交id,可以看到树文件的散列
如果我转到“对象”文件夹并搜索哈希值前两个字符的文件夹,则无法找到该文件夹
但我还是能拿到文件
我也从树的cat文件中尝试了文件(blob),但在objects文件夹中找不到包含hash的文件。有人能帮我理解为什么吗?你应该看看:
.git/objects/pack
……也是
Git确实使用了您描述的对象系统,但最终,当对象太多时,Git会让垃圾收集器负责打包对象,也就是说,收集一些对象,然后将它们连接到一个文件中(尽管没有压缩,因为对象已经被压缩了,因此它们可以直接在包文件中间访问)。除此之外,还创建了索引文件“*<强> IDX < /强>”,以便快速检索它们。
这会清除文件系统中每个文件最后一个块末尾的有用索引节点和剩余空间,但此操作需要时间和资源。这就是Git仅在特定时间触发此操作的原因
请参阅:。您能告诉我在pack文件夹中查看什么以及如何查看。我可以看到一堆文件*.idx和*.pack文件。但是如何将文件与上述提交id关联?因为我无法通过提交id哈希或树哈希查看任何文件。“.pack”是打包文件的名称(包含一堆常规对象,就像归档文件一样)。“.idx”是关联的索引文件,以其命名(相同的名称,不同的扩展名)。您可以像访问常规对象一样访问这些对象:它在Git的命令行中是透明的。如果您对它们的构建方式感兴趣,请按照我刚刚添加到上面文章中的文档链接进行操作。只需注意:包文件中的对象都像未打包的对象一样进行压缩,并且是增量编码的(针对彼此的解压缩副本)。增量压缩是消耗CPU时间最多的部分,因为Git必须花费大量精力查找彼此压缩良好的对象,并选择一个增量链顺序和长度以获得良好的压缩。