Nota: è possibile richiedere git rev-parse --short
lo SHA1 più corto ma unico.
Vedi " git get hash corto da hash regolare "
git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110
Come puoi vedere nel mio esempio, SHA1 ha una lunghezza di 5 anche se ho specificato una lunghezza di 4.
Per i grandi repository, 7 non è abbastanza dal 2010 e impegna dce9648 dallo stesso Linus Torvalds (git 1.7.4.4, ott 2010):
Il valore predefinito di 7 proviene da uno sviluppo git abbastanza precoce, quando sette cifre esadecimali erano molte (copre circa 250+ milioni di valori hash).
Allora pensavo che le revisioni a 65k fossero molte (era quello che stavamo per colpire in BK), e ogni revisione tendeva ad essere circa 5-10 nuovi oggetti o giù di lì, quindi un milione di oggetti era un grande numero.
(BK = BitKeeper)
In questi giorni, il kernel non è nemmeno il più grande progetto git, e anche il kernel ha circa 220k revisioni ( molto più grande di quanto l'albero BK sia mai stato) e ci stiamo avvicinando a due milioni di oggetti.
A quel punto, sette cifre esadecimali sono ancora uniche per molti di loro, ma quando parliamo solo di due ordini di differenza di grandezza tra il numero di oggetti e la dimensione dell'hash, ci saranno collisioni nei valori di hash troncati.
Non è nemmeno più vicino all'irrealistico: succede sempre.
Dovremmo sia aumentare l'abbrevia predefinito che era irrealisticamente piccolo, sia aggiungere un modo per le persone di impostare il proprio progetto predefinito nel file di configurazione git .
core.abbrev
Impostare la lunghezza a cui sono abbreviati i nomi degli oggetti.
Se non specificato, molti comandi abbreviano in 7 cifre esadecimali, il che potrebbe non essere sufficiente affinché i nomi degli oggetti abbreviati rimangano univoci per un tempo sufficientemente lungo.
environment.c
:
int minimum_abbrev = 4, default_abbrev = 7;
Nota: come commentato di seguito da marco.m , è core.abbrevLength
stato rinominato core.abbrev
in quello stesso Git 1.7.4.4 in commit a71f09f
Rinomina core.abbrevlength
incore.abbrev
Dopotutto corrisponde --abbrev=$n
all'opzione della riga di comando.
Più di recente, Linus ha aggiunto a commettere e6c587c (per Git 2.11, Q4 2016):
(come indicato nel Matthieu Moy 's risposta )
In tempi abbastanza precoci abbiamo in qualche modo deciso di abbreviare i nomi degli oggetti fino a 7 cifre esadecimali, ma man mano che i progetti crescono, sta diventando sempre più probabile vedere nomi di oggetti così brevi realizzati in giorni precedenti e registrati nei messaggi di registro non più unici.
Attualmente il progetto del kernel Linux richiede da 11 a 12 cifre esadecimali, mentre Git stesso ha bisogno di 10 cifre esadecimali per identificare in modo univoco gli oggetti che hanno, mentre molti progetti più piccoli potrebbero comunque andare bene con il valore predefinito di 7 cifre esadecimali. La taglia unica non si adatta a tutti i progetti.
Introdurre un meccanismo, in cui stimiamo il numero di oggetti nel repository alla prima richiesta per abbreviare un nome di oggetto con l'impostazione predefinita e creare un valore predefinito sano per il repository. Sulla base dell'aspettativa che si verifichino collisioni in un repository con 2^(2N)
oggetti quando si utilizzano nomi di oggetti abbreviati in primi N bit, utilizzare un numero sufficiente di cifre esadecimali per coprire il numero di oggetti nel repository.
Ogni hexdigit (4 bit) che aggiungiamo al nome abbreviato ci consente di avere quattro volte (2 bit) quanti più oggetti nel repository.
Vedi commit e6c587c (01 ott 2016) di Linus Torvalds ( torvalds
) .
Vedi commit 7b5b772 , commit 65acfea (01 ott 2016) di Junio C Hamano ( gitster
) .
(Unito da Junio C Hamano - gitster
- in commit bb188d0 , 03 ott 2016)
Quella nuova proprietà (indovinando un valore predefinito ragionevole per il valore abbreviato SHA1) ha un effetto diretto su come Git calcola il proprio numero di versione per il rilascio .