web-dev-qa-db-ja.com

特定のコードベースの変更を一意に識別するために、どの程度のgit shaが*一般的に*必要であると見なされますか?

たとえば、ディレクトリがGitリポジトリ内のコミット用に名前が付けられているディレクトリ構造を構築する場合、目がにじまないように、しかし衝突する可能性が十分に長くなるようにディレクトリを短くしたい場合無視できますが、一般的に必要なSHA部分文字列はどれくらいですか?

この変更を一意に識別したいとしましょう: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e92

最初の4文字まで使用できます: https://github.com/wycats/handlebars.js/commit/e629

しかし、それは危険だと感じています。しかし、2〜3年で、たとえば3万件の変更が発生する可能性があるコードベースを想定すると、8文字を使用した場合に衝突する可能性はありますか? 12?一般的にこの種のものに受け入れられると考えられる数字はありますか?

この質問は、実際には Pro Git本の第7章 で回答されています:

一般的に、8〜10文字でプロジェクト内で一意になります。最大のGitプロジェクトの1つであるLinuxカーネルは、40個のうち12個の文字が必要です。

7桁が短いSHAのGitのデフォルトであるため、ほとんどのプロジェクトで問題ありません。前述のように、カーネルチームは数回増加しました。これは数十万コミットがあるためです。したがって、3万件までのコミットでは、8桁または10桁で十分です。

204
Nevik Rehnel

これは誕生日の問題として知られています。

確率が1/2未満の場合、衝突の確率は次のように近似できます。

p〜=(n2)/(2m)

ここで、nはアイテムの数、mは各アイテムの可能性の数です。

16進ストリングの可能性の数は16ですc cは文字数です。

したがって、8文字と30Kのコミットに対して

30K〜= 215

p〜=(n2)/(2m)〜=((2152)/(2 * 168)= 230/ 233 =⅛

12文字に増やす

p〜=(n2)/(2m)〜=((2152)/(2 * 1612)= 230/ 249 = 2-19

27
plugwash

この質問は回答されましたが、背後にある数学を探している人のために-誕生日問題Wikipedia )と呼ばれています.

N人のグループから2人(またはそれ以上)の人が年の同じ日に誕生日を迎える確率についてです。これは、長さXの同じハッシュプレフィックスを持つ合計N個のコミットを持つリポジトリからの2つ(またはそれ以上)のgitコミットとほぼ同じです。

確率表 を見てください。たとえば、長さ8のハッシュ16進文字列の場合、リポジトリに約9300のアイテム(gitコミット)しかない場合、衝突が発生する確率は1%に達します。 110 000コミットの場合、確率は75%です。ただし、長さ12の16進数のハッシュ文字列がある場合、100,000コミットで衝突する確率は0.1%未満です。

11
Messa

Gitバージョン2.11(または2.12?)には、短い識別子(例:git log --oneline)で使用される文字数をプロジェクトのサイズに適応させる機能が含まれます。このようなバージョンのGitを使用すると、あなたの質問に対する答えは「Gitがgit log --onelineでどんな長さでも選ぶことができます。十分安全です」です。

詳細については、 「core.abbrev」のデフォルトを変更しますか?Git Rev Newsエディション20の説明 およびcommit bb188d00f7 を参照してください。

2
Matthieu Moy