每个git commit都归因于一个“签名”其内容的哈希。 它是否也标志了提交的来源,还是只是用于哈希计算的提交数据本身?
不同的措辞:是否不可能(除了散列冲突)伪造第二个存储库,其头部提交具有完全相同的散列和相同的内容,但树的其余部分不同?
答案 0 :(得分:4)
第二个问题的答案是肯定的(这是不可能的等等)。
第一个问题并不像我想的那样好,因为提交哈希实际上只是基于提交数据。导致第二个问题答案的关键是“提交数据”包括这些关键项,您可以在实际提交中看到这些项:
$ git cat-file -p HEAD
tree 22abd5c3fed5e2f49fb71e10b39d8c4929e51fc7
parent 4ebdeb68ba87282f87c39d790ba17fe1e021cc97
parent 9eabf5b536662000f79978c4d1b6e4eff5c8d785
[snip]
tree
行给出了树的哈希值(仅取决于树内容)和parent
行 - 在这种情况下为HEAD
是合并提交 - 给父级的哈希提交。鉴于当前提交的哈希取决于其树和父(s)的哈希值,如果您要构建具有不同历史记录或不同树的不同仓库,那么这些将具有不同的哈希值,以便提交将也有不同的哈希。
(此处通常使用的技术术语是Merkle Tree。)