【问题标题】:Does a git commit hash equal a repository state?git commit hash 是否等于存储库状态?
【发布时间】:2015-05-27 19:45:52
【问题描述】:

每个 git 提交都有一个哈希值,它“标记”其内容。 它是否还标记了提交的来源,还是只是用于哈希计算的提交数据本身?

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

【问题讨论】:

标签: git hash sha data-integrity


【解决方案1】:

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

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

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

tree 行给出了树的哈希值(这仅取决于树的内容)和 parent 行——在这种情况下是两个,因为HEAD 是一个合并提交——给出父提交。鉴于当前提交的哈希取决于其树和父级的哈希,如果您要构建具有不同历史记录或不同树的不同存储库,那么这些将具有不同的哈希,因此提交将也有不同的哈希值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2021-06-20
    • 2022-01-13
    • 2017-04-22
    相关资源
    最近更新 更多