如标题所示,该值是否基于内部所有树对象(递归)的内容?
即,如果两个树对象具有相同的哈希值,我可以将它们视为完全相同的文件树(包括所有子目录和文件)吗?
我认为不可能有两个具有相同哈希的树对象,因为对象文件由存储库中的哈希命名。此外,为了使两个树对象相同,它要求提交的状态在两种情况下都相同,直到所有暂存文件的内容,因为树对象保留对暂存文件的 SHA-1 引用。
这篇文章可能有助于澄清这一点。
希望这可以帮助。
为了扩展迈克尔安德森的答案,树对象的哈希计算方式与任何其他对象的哈希相同:它是 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(零字节)。
对象的原始数据。
对于树对象,原始数据是三元组重复出现的次数:模式、名称、哈希。模式是一个没有前导零的八进制数,以 ASCII 表示。它与名称用空格隔开(字节值 32 十进制)。该名称通常被假定为 UTF-8 字节,尽管很少或根本没有检查它是否是有效的 UTF-8;它不能包含 ASCII/
或 NUL 字符。它由 ASCII NUL 终止。使用 SHA-1 时,哈希是原始的 20 字节哈希 ID,使用 SHA-256 时是 32 字节哈希 ID。
这三个元组是由 Git 的索引生成的,Git 的索引是按排序顺序保存的。这意味着如果您想生成与Git相同的树对象数据,则必须以相同的顺序生成条目。我有示例 Python 代码,它将读取一个目录并在此处收集将进入树对象的数据。