Wenn Sie beispielsweise eine Verzeichnisstruktur erstellen möchten, in der ein Verzeichnis für ein Commit in einem Git-Repository benannt ist, und Sie möchten, dass es kurz genug ist, damit Ihre Augen nicht bluten, aber lang genug, dass die Wahrscheinlichkeit einer Kollision besteht wäre vernachlässigbar, wie viel von der SHA-Teilzeichenfolge wird im Allgemeinen benötigt?
Angenommen, ich möchte diese Änderung eindeutig identifizieren: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Ich kann nur die ersten vier Zeichen verwenden: https://github.com/wycats/handlebars.js/commit/e629
Aber ich denke, das wäre riskant. Wenn Sie jedoch eine Codebasis annehmen, die über ein paar Jahre beispielsweise 30.000 Änderungen aufweisen könnte, wie hoch ist die Wahrscheinlichkeit einer Kollision, wenn ich 8 Zeichen verwende? 12? Gibt es eine Zahl, die für solche Dinge allgemein als akzeptabel angesehen wird?
Antworten:
Diese Frage wird tatsächlich in Kapitel 7 des Pro Git-Buches beantwortet :
7 Stellen ist die Git-Standardeinstellung für eine kurze SHA, daher ist dies für die meisten Projekte in Ordnung. Das Kernel-Team hat, wie bereits erwähnt, seine Anzahl mehrmals erhöht, da es mehrere hunderttausend Commits hat. Für Ihre ~ 30.000 Commits sollten also 8 oder 10 Ziffern vollkommen in Ordnung sein.
quelle
git
ziemlich klug ist. Sie können die Abkürzung kurz setzen, z. B. 4, undgit
4 Ziffern für so viele Hashes wie möglich verwenden.Hinweis: Sie können
git rev-parse --short
nach dem kürzesten und dennoch einzigartigen SHA1 fragen .Siehe " Git Get Short Hash von regulärem Hash "
Für große Repos reicht 7 seit 2010 nicht mehr aus und Commit dce9648 von Linus Torvalds selbst (git 1.7.4.4, Okt 2010):
(BK = BitKeeper)
environment.c
::Hinweis: Wie unten von marco.m kommentiert ,
core.abbrevLength
wurde in umbenanntcore.abbrev
demselben Git 1.7.4.4 in Commit a71f09f umbenanntIn neuerer Zeit hinzugefügt Linus in e6c587c begehen (für Git 2.11, Q4 2016):
(wie in erwähnt Matthieu Moy ‚s Antwort )
Siehe Commit e6c587c (01. Oktober 2016) von Linus Torvalds (
torvalds
) .Siehe Commit 7b5b772 , Commit 65acfea (01. Oktober 2016) von Junio C Hamano (
gitster
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit bb188d0 , 03. Oktober 2016)Diese neue Eigenschaft (die einen vernünftigen Standard für den Abkürzungswert von SHA1 errät) hat direkten Einfluss darauf, wie Git seine eigene Versionsnummer für die Veröffentlichung berechnet .
quelle
core.abbrevLength
in umbenannt wurdecore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
, um 10 Zeichen zu generieren. Wir haben verwendetgit log -1 --format=%h
, aber das hat nur 7 Zeichen generiert und wir haben eine Kollision bekommen.Dies ist als Geburtstagsproblem bekannt.
Für Wahrscheinlichkeiten von weniger als 1/2 kann die Wahrscheinlichkeit einer Kollision als angenähert werden
p ~ = (n 2 ) / (2 m)
Dabei ist n die Anzahl der Elemente und m die Anzahl der Möglichkeiten für jedes Element.
Die Anzahl der Möglichkeiten für eine Hex-Zeichenfolge beträgt 16 c wobei c die Anzahl der Zeichen ist.
Also für 8 Zeichen und 30K Commits
30K ~ = 2 15
p ~ = (n 2 ) / (2m) = ~ ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛
Erhöht es auf 12 Zeichen
p ~ = (n 2 ) / (2m) = ~ ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19
quelle
Diese Frage wurde beantwortet, aber für alle, die nach der Mathematik dahinter suchen - sie heißt Geburtstagsproblem ( Wikipedia ).
Es geht um die Wahrscheinlichkeit, dass 2 (oder mehr) Personen aus einer Gruppe von N Personen am selben Tag im Jahr Geburtstag haben. Dies ist analog zu wahrscheinlich 2 (oder mehr) Git-Commits aus dem Repository mit insgesamt N Commits mit demselben Hash-Präfix der Länge X.
Schauen Sie sich die Wahrscheinlichkeitstabelle an . Beispielsweise erreicht für eine Hash-Hex-Zeichenfolge der Länge 8 die Wahrscheinlichkeit einer Kollision 1%, wenn das Repository nur etwa 9300 Elemente enthält (Git-Commits). Für 110 000 Commits beträgt die Wahrscheinlichkeit 75%. Wenn Sie jedoch eine Hash-Hex-Zeichenfolge der Länge 12 haben, liegt die Wahrscheinlichkeit einer Kollision bei 100 000 Commits unter 0,1%.
quelle
Git Version 2.11 (oder vielleicht 2.12?) Enthält eine Funktion, die die Anzahl der in kurzen Bezeichnern verwendeten Zeichen (z. B.
git log --oneline
) an die Größe des Projekts anpasst . Sobald Sie eine solche Version von Git verwenden, kann die Antwort auf Ihre Frage lauten: "Wählen Sie die Länge aus, mit der Git Ihnen zur Verfügung steht."git log --oneline
, es ist sicher genug".Weitere Informationen finden Sie unter Ändern der Standardeinstellung für "core.abbrev". Diskussion in Git Rev News Edition 20 und Commit bb188d00f7 .
quelle