2015-09-16 15 views
10

私は、この事件の極端に少ない確率を認識していると言ってこれを接頭語にします。製造が不可能であることはわかっていて、極端には「野生で」起こることはありません。これは単にGitの内部についてのwhat-if質問です。2つのGitコミットが同じSHA-1ハッシュを持つとどうなりますか?

これは私の質問です.2つのGitコミットハッシュが同じであればどうなりますか?初心者の方:

  • コミットは成功しますか?
  • 後でデタッチヘッドとしてチェックアウトできますか?
  • 後続のコミットは可能でしょうか?
+1

ここにいくつかの議論がありますが、私はそれが本当に質問に答える素晴らしい仕事とは思わない:http://stackoverflow.com/questions/10434326/hash-collision-in-git – mipadi

+0

私はそれを実際に見たハッシュをコミットするのではなく、ファイルハッシュについて議論しているようです。 – Ben

+1

ええ、答えのほとんどはGitのハッシュの部分に焦点を当てています。しかし、Gitメーリングリストに関するディスカッションへのリンクがあります:http://thread.gmane.org/gmane.comp.version-control.git/26106/focus=26170 – mipadi

答えて

3

私の古い回答「How would git handle a SHA-1 collision on a blob?」は、コミットであってもブロブでなくても適用されます。
torekにはin the commentsと記載されているので、gitはすべてを「オブジェクト」と考えています。それぞれが独自のSHA1を持っています。

https://git-scm.com/book/en/v2/book/10-git-internals/images/data-model-4.png

ProGit Book v2Git Internals - Git References章からの画像)

コミット可能性が高い(小切手のカップルがgit-commit-tree.cである)成功しないだろうが、あなたはまた、どこのケースを考慮する必要がありますrepos AとB ...で同じSHA1(と何らかの形で異なる内容)を持つ2つのコミットが作成され、repo Aがrepo Bをフェッチしています!
Commit 8685da4 (March 2007, git 1.5.1)がそれを処理し、フェッチが失敗します。
Commit 0e8189e (Oct. 2008, git 1.6.1)index V2と、それを言及しない:

SHA1参照のオッズが破損得るためにそれが実際に同じ大きさの別のオブジェクトのSHA1(デルタ・ヘッダ・ストアの予想サイズと一致するように適用する基底オブジェクト)は事実上ゼロです。

オブジェクトをアンパックするときに、パックされたオブジェクトのCRCチェックを実装します。

関連する問題