正如标题所示,是否基于所有树对象(递归)内容的值?
即,如果它们具有相同的哈希值,我可以将两个树对象视为完全相同的文件树(包括所有子目录和文件)吗?
答案 0 :(得分:1)
您可以看到有关用于计算树SHA here的内容的一些粗略详细信息。
可以找到有关存储树的二进制格式的更多信息here。
使用的实际SHA只是该详细版本中描述的缓冲区的SHA。
回归的关键点是SHA取决于所有包含的对象或树的文件名,它们的SHA及其权限。更改其中任何一个并更改SHA。如果两棵树具有相同的SHA,则所有这些组件必须匹配(不包括碰撞的可能性,因为它们几乎不可能)。
答案 1 :(得分:0)
我不认为有两个具有相同哈希的树对象是可能的,因为目标文件是由存储库中的哈希命名的。此外,为了使两个树对象相同,在两种情况下都要求提交状态相同,直到所有分阶段文件的内容,因为树对象保持对阶段文件的SHA-1引用。
这post可能有助于澄清这一点。
希望这有帮助。
答案 2 :(得分:0)
稍微扩展一下 Michael Anderson's answer,树对象的散列的计算方式与任何其他对象的散列相同:它是 H(object-content-including-header),其中 H 是散列函数 (SHA- 1 或,现在,SHA-256)。内容包括标题具有链接中描述的形式:
对象的类型:文字文本“blob”、“tree”、“commit”或“tag”(后跟一个空格)。它们是 ASCII 或 UTF-8(因为它们仅由 ASCII 字节组成,所以无论如何它都只是一个字节串)。
对象大小的 ASCII 表示,以十进制表示。例如,如果剩余的数据长度为 16 个字节,我们将得到 ASCII 字符 1
和 6
。
一个 ASCII NUL(零字节)。
对象的原始数据。
对于 tree 对象,原始数据是三元组的一些重复出现次数:模式、名称、哈希。模式是一个没有前导零的八进制数,以 ASCII 表示。它与名称之间用空格分隔(字节值 32 十进制)。该名称通常被假定为 UTF-8 字节,尽管很少或根本没有检查它是否是有效的 UTF-8;它不得包含 ASCII /
或 NUL 字符。它以 ASCII NUL 结束。使用 SHA-1 时哈希是原始的 20 字节哈希 ID,使用 SHA-256 时是 32 字节哈希 ID。
这些三元组是从Git的索引生成的,Git的索引是按照排序的顺序保存的。这意味着,如果您想生成 Git 将要生成的 相同 树对象数据,则必须以 相同的顺序 生成条目。我有示例 Python 代码,它将读取一个目录并收集将进入树对象 here 的数据。