Wie lange muss das längste Hash-Präfix in meinem Repo sein, um Überschneidungen zu vermeiden?

7

Das --abbrev-commit -Flag kann in Verbindung mit git log und git rev-list verwendet werden, um anstelle der vollen SHA-1-Hashes mit 40 Zeichen von Commit-Objekten Teilpräfixe anzuzeigen. Laut dem Pro Git Buch ,

  

verwendet standardmäßig sieben Zeichen, verlängert sie jedoch bei Bedarf, um den SHA-1 eindeutig zu halten [...]

Darüber hinaus sind kurze SHAs mindestens 4 Zeichen lang. Immer noch nach dem Pro Git Buch,

  

Im Allgemeinen sind acht bis zehn Zeichen mehr als genug, um innerhalb eines Projekts eindeutig zu sein.

     

Als Beispiel hat der Linux-Kernel, der ein ziemlich großes Projekt mit über 450.000 Commits und 3,6 Millionen Objekten ist, keine zwei Objekte, deren SHA-1 sich mehr als die ersten 11 Zeichen überschneiden.

Da die Länge des längsten Präfixes, das erforderlich ist, um Überschneidungen zwischen allen Präfix-Hashes von Commit-Objekten zu vermeiden (11 im Falle des Linux-Kernels), ein grober Indikator für die Größe eines Repos ist, möchte ich programmatisch den entsprechende Menge in meinem eigenen lokalen Repository. Wie kann ich das tun?

    
Jubobs 04.09.2015, 20:14
quelle

2 Antworten

14

Das folgende Shell-Skript gibt, wenn es in einem lokalen Repo ausgeführt wird, die Länge des längsten Präfix aus, das erforderlich ist, um eine Überlappung zwischen allen Präfix-Hashes der Commit-Objekte dieses Repositorys zu verhindern.

%Vor%

Beim letzten Bearbeiten dieser Antwort wurde das Skript gedruckt

Jubobs 04.09.2015, 20:28
quelle
6

Jubobs Skript ist großartig, upvoted.

Wenn Sie sich eine Vorstellung von der Verteilung der Mindest-Commit-Hash-Länge machen wollen, können Sie diesen One-Liner ausführen:

%Vor%

Für das git-Projekt selbst (git-on-git) ergibt sich so etwas wie:

%Vor%

... ergibt 1788 Commits, die mit einem 4 -char Hash (oder niedriger, das ist Git's minimales Kürzel) und 4 eindeutig dargestellt werden kann Commits, bei denen 9 -40 Zeichen des Hashwerts erforderlich sind, um sie eindeutig auszuwählen.

Im Vergleich dazu hat ein viel größeres Projekt wie der Linux-Kernel diese Distribution heute:

%Vor%

Bei einer Datenbank mit fast 5 Millionen Objekten und 600.000 Commits gibt es 3 Commits, die derzeit 11 von 40 hexadezimalen Ziffern benötigen, um sie von allen anderen Commits zu unterscheiden.

    
javabrett 24.05.2016 01:49
quelle