Nota: puede solicitar git rev-parse --short
el SHA1 más corto y único.
Consulte " git get hash corto de hash regular "
git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110
Como puede ver en mi ejemplo, el SHA1 tiene una longitud de 5 incluso si especifiqué una longitud de 4.
Para repositorios grandes, 7 no es suficiente desde 2010, y comete dce9648 por el propio Linus Torvalds (git 1.7.4.4, oct 2010):
El valor predeterminado de 7 proviene bastante temprano en el desarrollo de git, cuando siete dígitos hexadecimales eran mucho (cubre más de 250 millones de valores hash).
En aquel entonces, pensé que 65k revisiones eran muchas (era lo que estábamos a punto de alcanzar en BK), y cada revisión tiende a ser de 5 a 10 objetos nuevos más o menos, por lo que un millón de objetos era un gran número.
(BK = BitKeeper)
En estos días, el núcleo ni siquiera es el proyecto git más grande, e incluso el núcleo tiene alrededor de 220k revisiones ( mucho más grande que el árbol BK) y nos estamos acercando a dos millones de objetos.
En ese punto, siete dígitos hexadecimales siguen siendo únicos para muchos de ellos, pero cuando hablamos de solo dos órdenes de diferencia de magnitud entre el número de objetos y el tamaño del hash, habrá colisiones en valores de hash truncados.
Ya no es casi irreal: sucede todo el tiempo.
Ambos deberíamos aumentar la abreviatura predeterminada que era irrealmente pequeña, y agregar una forma para que las personas establezcan su propio valor predeterminado por proyecto en el archivo de configuración de git .
core.abbrev
Establezca la longitud a la que se abrevian los nombres de objeto.
Si no se especifica, muchos comandos abrevian a 7 dígitos hexadecimales, lo que puede no ser suficiente para que los nombres abreviados de objetos permanezcan únicos durante un tiempo suficientemente largo.
environment.c
:
int minimum_abbrev = 4, default_abbrev = 7;
Nota: Como se comenta a continuación por marco.m , core.abbrevLength
se renombró core.abbrev
en ese mismo Git 1.7.4.4 en commit a71f09f
Cambiar el nombre core.abbrevlength
acore.abbrev
Corresponde a la --abbrev=$n
opción de línea de comando después de todo.
Más recientemente, Linus agregó en commit e6c587c (para Git 2.11, Q4 2016):
(como se menciona en la respuesta de Matthieu Moy )
En los primeros días, de alguna manera decidimos abreviar los nombres de los objetos a 7 dígitos hexadecimales, pero a medida que los proyectos crecen, es cada vez más probable ver nombres de objetos tan cortos hechos en días anteriores y registrados en los mensajes de registro que ya no son únicos.
Actualmente, el proyecto de kernel de Linux necesita de 11 a 12 dígitos hexadecimales, mientras que Git necesita 10 dígitos hexadecimales para identificar de forma exclusiva los objetos que tienen, mientras que muchos proyectos más pequeños pueden estar bien con el valor predeterminado original de 7 dígitos hexadecimales. Un tamaño no se adapta a todos los proyectos.
Introduzca un mecanismo, donde estimamos el número de objetos en el repositorio en la primera solicitud para abreviar el nombre de un objeto con la configuración predeterminada y llegar a un valor predeterminado sensato para el repositorio. Según la expectativa de que veríamos una colisión en un repositorio con 2^(2N)
objetos al usar nombres de objetos acortados a los primeros N bits, use un número suficiente de dígitos hexadecimales para cubrir el número de objetos en el repositorio.
Cada dígito hexadecimal (4 bits) que agregamos al nombre abreviado nos permite tener cuatro veces (2 bits) tantos objetos en el repositorio.
Ver commit e6c587c (01 oct 2016) por Linus Torvalds ( torvalds
) .
Ver commit 7b5b772 , commit 65acfea (01 Oct 2016) por Junio C Hamano ( gitster
) .
(Fusionada por Junio C Hamano - gitster
- en commit bb188d0 , 03 oct 2016)
Esa nueva propiedad (adivinar un valor predeterminado razonable para el valor abreviado SHA1) tiene un efecto directo sobre cómo Git calcula su propio número de versión para su lanzamiento .