如果我没弄错的话,每次提交都会有一个SHA-1校验和。为了生成这样的散列值,Git还将前一次提交作为散列函数的输入。也就是说,除了哈希值冲突(无论是意外还是攻击),假设我看到两个存储库的最后一次提交具有相同的哈希值,我可以确信这两个存储库是完全相同的。
这种理解是正确的吗?
发布于 2021-05-25 17:21:11
由于SHA1的冲突如此之小,以至于我们忽略了它,我们可以将其视为它所代表的内容的唯一标识符。因此,如果来自不同repos的2个提交具有相同的SHA1,则这些提交是相同的,并且它们的历史记录是相同的。但这并不意味着这些repos具有相同的提交列表。
顺便说一句,这个特性被GitHub广泛使用:在内部,它们将存储库的所有分支组合成一个大存储库。这样就消除了多余的拷贝。
发布于 2021-05-25 22:46:06
当两个独立存储库中的两个提交具有相同的对象ID时,它们将引用相同的历史记录,包括可从它们访问的所有提交、树和blobs,假设没有发生散列冲突。
请注意,这并不意味着存储库是完全相同的。这两个存储库可能有分支、标记或其他指向不同提交的引用,它们也可能有reflog引用的不同对象集。
请注意,如果您使用的是SHA-1存储库,依赖于没有散列冲突是不安全的。创建SHA-1碰撞的成本是approximately USD 11000,因此任何中型公司或政府机构都可以负担得起创建碰撞的费用。虽然Git有检测冲突对象是否被推送到存储库的措施,但如果存储库是分开的,这将不会有任何影响。如果您需要完整性,则需要使用SHA-256存储库。
https://stackoverflow.com/questions/67692712
复制相似问题