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 "
git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110
Wie Sie in meinem Beispiel sehen können, hat der SHA1 eine Länge von 5, auch wenn ich eine Länge von 4 angegeben habe.
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):
Der Standardwert von 7 stammt aus einer ziemlich frühen Phase der Git-Entwicklung, als sieben Hex-Ziffern viel waren (er deckt mehr als 250 Millionen Hash-Werte ab).
Damals dachte ich, dass 65.000 Revisionen eine Menge waren (es war das, was wir in BK treffen wollten), und jede Revision besteht aus ungefähr 5-10 neuen Objekten, also war eine Million Objekte eine große Zahl.
(BK = BitKeeper)
Heutzutage ist der Kernel nicht einmal das größte Git-Projekt, und selbst der Kernel hat ungefähr 220.000 Revisionen ( viel größer als der BK-Baum jemals war) und wir nähern uns zwei Millionen Objekten.
Zu diesem Zeitpunkt sind sieben hexadezimale Ziffern für viele von ihnen immer noch eindeutig. Wenn es sich jedoch um einen Unterschied von nur zwei Größenordnungen zwischen der Anzahl der Objekte und der Hash-Größe handelt, kommt es zu Kollisionen bei abgeschnittenen Hash-Werten.
Es ist nicht mehr annähernd unrealistisch - es passiert die ganze Zeit.
Wir sollten sowohl die unrealistisch kleine Standardabkürzung erhöhen als auch eine Möglichkeit für Benutzer hinzufügen, ihre eigenen Standardabkürzungen pro Projekt in der Git-Konfigurationsdatei festzulegen .
core.abbrev
Legen Sie die Länge fest, mit der Objektnamen abgekürzt werden.
Wenn nicht angegeben, werden viele Befehle auf 7 Hexdigits abgekürzt, was möglicherweise nicht ausreicht, damit abgekürzte Objektnamen ausreichend lange eindeutig bleiben.
environment.c
::
int minimum_abbrev = 4, default_abbrev = 7;
Hinweis: Wie unten von marco.m kommentiert , core.abbrevLength
wurde in umbenanntcore.abbrev
demselben Git 1.7.4.4 in Commit a71f09f umbenannt
Umbenennen core.abbrevlength
zurück incore.abbrev
Es entspricht --abbrev=$n
Befehlszeilenoption.
In neuerer Zeit hinzugefügt Linus in e6c587c begehen (für Git 2.11, Q4 2016):
(wie in erwähnt Matthieu Moy ‚s Antwort )
In relativ frühen Tagen haben wir uns irgendwie dazu entschlossen, Objektnamen auf 7 Hexadezimalzahlen abzukürzen, aber mit dem Wachstum von Projekten wird es immer wahrscheinlicher, dass so kurze Objektnamen, die in früheren Tagen erstellt und in den Protokollnachrichten aufgezeichnet wurden, nicht mehr eindeutig sind.
Derzeit benötigt das Linux-Kernel-Projekt 11 bis 12 Hexdigits, während Git selbst 10 Hexdigits benötigt, um die Objekte eindeutig zu identifizieren, während viele kleinere Projekte mit dem ursprünglichen 7-Hexdigit-Standard möglicherweise noch in Ordnung sind. Einheitsgröße passt nicht für alle Projekte.
Führen Sie einen Mechanismus ein, bei dem wir die Anzahl der Objekte im Repository bei der ersten Anforderung schätzen, einen Objektnamen mit der Standardeinstellung abzukürzen und einen vernünftigen Standard für das Repository zu erstellen. 2^(2N)
Verwenden Sie basierend auf der Erwartung, dass bei Verwendung von Objektnamen, die auf die ersten N Bits verkürzt sind, eine Kollision in einem Repository mit Objekten sehen, eine ausreichende Anzahl von Hexdigits, um die Anzahl der Objekte im Repository abzudecken.
Jedes Hexdigit (4 Bit), das wir dem verkürzten Namen hinzufügen, ermöglicht es uns, viermal (2 Bit) so viele Objekte im Repository zu haben.
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 .