git - git commit hash 是否等于存储库状态?

标签 git hash sha data-integrity

每个 git 提交都被归因于一个散列,该散列“签署”其内容。 它是否也标记提交的来源,或者只是用于哈希计算的提交数据本身?

不同的措辞:是否不可能(除了哈希冲突)伪造第二个存储库,其头部提交具有完全相同的哈希和相同的内容,但树的其余部分不同?

最佳答案

第二个问题的答案是肯定的(不可能等)。

第一个问题的格式并不像我想的那样好,因为提交哈希实际上只是基于提交数据。导致第二个问题的答案的关键是“提交数据”包括这些关键项,您可以在实际提交中看到它们:

$ git cat-file -p HEAD
tree 22abd5c3fed5e2f49fb71e10b39d8c4929e51fc7
parent 4ebdeb68ba87282f87c39d790ba17fe1e021cc97
parent 9eabf5b536662000f79978c4d1b6e4eff5c8d785
[snip]

tree 行给出树的散列(仅取决于树的内容)和 parent 行——在本例中为 两行HEAD 是一个 merge 提交——给出父提交的哈希值。鉴于当前提交的哈希值取决于其树和父项的哈希值,如果您要构建具有不同历史记录或不同树的不同 repo 协议(protocol),那么它们将具有不同的哈希值,以便提交将也有不同的散列。

(这里通常使用的技术术语是Merkle Tree。)

关于git - git commit hash 是否等于存储库状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30481370/

相关文章:

Git 使用 Vim 来提交消息

git - 当 git 说它是 "resolving deltas"时,它实际上在做什么?

java - SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA512") 抛出 NoSuchAlgorithmException

java - 当 "salted"时,SHA512 哈希给出不正确的(?)结果

java - PBKDF2WithHmacSHA256 key 长度对输出长度的影响

git - 从原始 repo 更新 github fork

linux - 将 git 仓库克隆到离线机器

c - 关于哈希函数

javascript - url 哈希更改时强制重新加载

c++ - 如何找到哈希表的大小?