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

3
我是一个有用的助手,可以翻译文本。
我正在阅读 Git 工作原理的内部内容。我了解到 Git 把所有东西都存储在对象文件夹中。它首先对文件进行 SHA1 哈希处理,然后将其存储在对象文件夹中。我尝试在我的一个代码库上运行以下命令,但在对象目录中找不到哈希文件,但使用 cat-file 命令,我可以看到命令。我是否漏掉了什么?以下是我为了了解而执行的步骤。
我执行了 git log 命令以查找最新提交。

enter image description here

然后我使用 cat-file 命令查看所提到的提交 ID 并可以看到树文件的哈希值。

enter image description here

如果我进入对象文件夹并搜索哈希值的前两个字符所在的文件夹,我将无法找到该文件夹。

enter image description here

但我仍然能够获取文件。

enter image description here

我也尝试过使用树的cat-file获取文件(blob),但无法在对象文件夹中找到哈希值对应的文件。有人可以帮我理解为什么吗?

1个回答

7
你应该看一下:
.git/objects/pack

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

这两者都会清除文件系统上每个文件的最后一个块中剩余的有用的inode和空间,但此操作需要时间和资源。这就是为什么Git只在特定时间触发此操作的原因。

参见:Git内部:Pack文件


你能告诉我如何查看pack文件夹中的内容吗?我可以看到一堆*.idx和*.pack文件。但是如何将文件与上述提交ID相关联呢?因为我无法通过提交ID哈希或树哈希看到任何文件。 - Arpit Agrawal
".pack" 是打包文件的名称(包含一堆常规对象,就像一个存档文件)。 ".idx" 是相关联的索引文件,以相同的名称命名,但扩展名不同。您可以像访问常规对象一样访问这些对象:从Git的命令行中是透明的。但是,如果您对它们的构建方式感兴趣,请按照我刚刚添加到帖子中的文档链接。 - Obsidian
2
只是一点小提示:打包文件中的对象既像未打包的对象一样被压缩,进行了增量编码(针对彼此的解压缩副本)。增量压缩是消耗最多 CPU 时间的部分,因为 Git 必须花费大量精力找到相互之间压缩得好的对象,并选择一个能够产生良好压缩效果的增量链顺序和长度。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接