git 何时真正验证提交链的完整性?

When does git actually verify the integrity of the commit chain?

我已多次阅读 git 中基于 SHA-1 哈希和父提交链接的完整性机制,确保不会对 git 中提交的数据进行任何更改存储库。

我的问题是:在哪些操作期间 git 检查散列是否有效,即。 e.匹配提交的内容?是在推还是拉期间执行检查?不幸的是,我还没有找到这方面的任何信息。

是正确的:每个 Git 对象的名称 对象内容的哈希 ID,因此使用该 ID 的任何东西查找和阅读内容可以而且通常会验证提取数据的哈希是否与用作提取该数据的密钥的 ID 相匹配。

额外的检查——验证标签或提交中的 GPG 签名——仅在您明确要求时才进行。您可以使用 log.showSignature 配置设置请求 git log 默认检查此类签名。

请注意,Merkle tree 中任何节点的完整性取决于您是否信任先前节点免受第二原像攻击。如果您使用 GPG 签名的标签,这些标签中的签名会保护每个标签的数据(无论您信任 GPG 本身的程度如何),然后标签保护其提交对象(无论您信任 SHA-1 的程度如何)。提交对象反过来保护它的树,树保护它的子树和 blob,而 blob 散列保护它们的内容。因此,如果您担心第二原像攻击,则应该进行不同类型的分析。如果您只关心随机数据损坏(如在旋转媒体 and/or 非 ECC 内存上看到的那样),您可以像 Git 那样直接使用 SHA-1 哈希。