0

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

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

4

3 回答 3

1

您可以在此处查看有关用于计算树 SHA 的一些粗略细节。

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

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

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

于 2012-08-23T05:20:43.783 回答
0

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

这篇文章可能有助于澄清这一点。

希望这可以帮助。

于 2013-01-15T02:32:07.367 回答
0

为了扩展迈克尔安德森的答案,树对象的哈希计算方式与任何其他对象的哈希相同:它是 H(object-content-including-header),其中 H 是哈希函数(SHA-1 或者,现在, SHA-256)。包含标题的内容具有链接中描述的形式:

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

  • 对象大小的 ASCII 表示,以十进制表示。例如,如果剩余的数据是 16 字节长,我们会得到 ASCII 字符16.

  • 一个 ASCII NUL(零字节)。

  • 对象的原始数据。

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

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

于 2021-01-26T01:25:45.650 回答