Git:树对象的SHA1值是如何生成的?

Git:树对象的SHA1值是如何生成的?,git,sha,Git,Sha,正如标题所示,值是否基于内部所有树对象(递归)的内容 也就是说,如果两个树对象具有相同的哈希值,我是否可以将它们视为完全相同的文件树(包括所有子目录和文件)?您可以看到有关计算树的内容的一些粗略细节 可以找到有关存储树的二进制格式的更多信息 实际使用的SHA只是该详细版本中描述的缓冲区的SHA 需要了解的关键点是,SHA依赖于所有包含的对象或树的文件名、它们的SHA及其权限。改变其中任何一个,你就改变了SHA。如果两个树具有相同的SHA,那么所有这些组件都必须匹配(排除冲突的可能性,因为它们几乎

正如标题所示,值是否基于内部所有树对象(递归)的内容


也就是说,如果两个树对象具有相同的哈希值,我是否可以将它们视为完全相同的文件树(包括所有子目录和文件)?

您可以看到有关计算树的内容的一些粗略细节

可以找到有关存储树的二进制格式的更多信息

实际使用的SHA只是该详细版本中描述的缓冲区的SHA


需要了解的关键点是,SHA依赖于所有包含的对象或树的文件名、它们的SHA及其权限。改变其中任何一个,你就改变了SHA。如果两个树具有相同的SHA,那么所有这些组件都必须匹配(排除冲突的可能性,因为它们几乎不可能)。

我认为不可能有两个具有相同哈希的树对象,因为对象文件是由存储库中的哈希命名的。此外,为了使两个树对象相同,需要在这两种情况下提交的状态完全相同,直到所有暂存文件的内容,因为树对象保持对暂存文件的SHA-1引用

这可能有助于澄清这一点

希望这会有所帮助。

为了进一步展开,树对象的哈希计算方法与任何其他对象的哈希计算方法相同:它是H(对象内容包括标题),其中H是哈希函数(SHA-1或现在的SHA-256)。包括标题在内的内容具有链接中描述的形式:

  • 对象的类型:文本文本“blob”、“tree”、“commit”或“tag”(后跟空格)。它们是ASCII或UTF-8格式的(因为它们只包含ASCII字节,所以无论哪种方式,它都只是一个字节字符串)

  • 对象大小的ASCII表示,以十进制表示。例如,如果剩余的数据长度为16字节,我们将获得ASCII字符
    1
    6

  • ASCII NUL(零字节)

  • 对象的原始数据

对于树对象,原始数据是三元组的重复出现次数:模式、名称、哈希。模式是不带前导零的八进制数,以ASCII表示。它与名称之间用空格分隔(字节值为32位小数)。该名称通常假定为UTF-8字节,尽管很少或根本没有检查它是否为有效的UTF-8;它不能包含ASCII
/
或NUL字符。它由ASCII NUL终止。当使用SHA-1时,散列是原始的20字节散列ID,当使用SHA-256时,散列是32字节散列ID


这三个元组是从Git的索引生成的,Git的索引保持排序顺序。这意味着,如果您想要生成与Git相同的树对象数据,则必须以相同的顺序生成条目。我有一个Python示例代码,它将读取目录并收集将进入树对象的数据。

我不知道实现的细节,但是Linus自己声称你最后的陈述是真实的,并且是git的整体基础。你所说的子树是什么意思?你能举一个遗憾的例子来解释你的问题吗?因为它不清楚对不起,但它似乎没有详细说明SHA是如何计算的。我发现的是这样一句话:“
这是SHA-1散列-您正在存储的内容的校验和加上一个标题”
。添加了更多细节,详细说明了树是如何存储的以及SHA是如何计算的。