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 类型字符串之一开头:blob
、commit
、tag
或 tree
(后跟 space,然后大小的 decimal-expansion-in-ASCII 和 '\0' 字节)。
如果Git提取整个object——-t
代码可以走捷径,提前停止解压——Git然后将验证object,包括 header,通过哈希函数反馈,产生用于检索 object 的密钥。如果 Git 突然停止(就像 -t
那样),Git 会跳过验证步骤。
以下 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 类型字符串之一开头:blob
、commit
、tag
或 tree
(后跟 space,然后大小的 decimal-expansion-in-ASCII 和 '\0' 字节)。
如果Git提取整个object——-t
代码可以走捷径,提前停止解压——Git然后将验证object,包括 header,通过哈希函数反馈,产生用于检索 object 的密钥。如果 Git 突然停止(就像 -t
那样),Git 会跳过验证步骤。