git cat-file -t <object id> 如何判断object 的类型?

How does git cat-file -t <object id> determine the type of object?

以下 link 解释了 Git 如何计算 object 个 ID(ruby 代码片段)。 object 类型(blob、树、提交)在与内容连接的 header 中编码,并在连接的字符串上计算 SHA1。

https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

可以使用 git cat-file -t <object id> 来确定 object(blob、树、提交)的类型。

鉴于 SHA1 是单向哈希函数,我想知道此命令如何从 object ID 中提取类型?

given that SHA1 is a oneway hashing function

那是无关紧要的。 SHA 没有隐瞒任何事情。相反。将 SHA 视为一个地址。该地址的文件是可读的,并说明了类型。

“你把它倒过来了。”

虽然 SHA 确实是一个 one-way 哈希,但这不是问题:您自己提供哈希,Git 用作key-value database 中的一个键,允许 Git 检索数据。 (如果您提供散列的一部分,而不是全部,Git 查找与该前缀匹配的键;如果前缀是唯一的,Git 假定生成的匹配键是正确的键。 )

获得数据后——zlib-compressedobject——Git现在只需要解压缩该数据的前几个字节。它们以四个 object 类型字符串之一开头:blobcommittagtree(后跟 space,然后大小的 decimal-expansion-in-ASCII 和 '\0' 字节)。

如果Git提取整个object——-t代码可以走捷径,提前停止解压——Git然后将验证object,包括 header,通过哈希函数反馈,产生用于检索 object 的密钥。如果 Git 突然停止(就像 -t 那样),Git 会跳过验证步骤。