tag - qué tipos de etiquetas existen en git
¿Cómo maneja Git(Hub) las posibles colisiones de SHA cortos? (3)
Tanto Git como GitHub muestran versiones cortas de SHA, solo los primeros 7 caracteres en lugar de los 40, y tanto Git como GitHub admiten tomar estos SHA cortos como argumentos.
Ej. git show 962a9e8
Por ejemplo, https://github.com/joyent/node/commit/962a9e8
Dado que la posibilidad de espacio ahora es de órdenes de magnitud más baja, "solo" 268 millones , ¿cómo protegen Git y GitHub contra las colisiones aquí? ¿Y cómo los manejan?
Dos notas aquí:
Si escribe y en cualquier lugar de la página de GitHub que muestra un compromiso, verá los 40 bytes completos de dicho compromiso.
Eso ilustra el punto de : GitHub no trunca nada.Y 7 dígitos hexadecimales (28 bits) no es suficiente desde 2010 de todos modos.
Ver commit dce9648 por el mismo Linus Torwalds (octubre de 2010, git 1.7.4.4):
El valor predeterminado de 7 viene de bastante temprano en el desarrollo de git, cuando siete dígitos hexadecimales eran muchos (cubre unos 250+ millones de valores hash). En aquel entonces pensé que las revisiones de 65k 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, por lo que un millón de objetos era un número grande.
(BK = BitKeeper)
En estos días, el kernel ni siquiera es el proyecto de git más grande, e incluso el kernel tiene aproximadamente 220.000 revisiones ( mucho más grande que el árbol BK) y nos estamos acercando a dos millones de objetos. En ese momento, siete dígitos hexadecimales aún son únicos para muchos de ellos, pero cuando estamos hablando de solo dos órdenes de diferencia de magnitud entre el número de objetos y el tamaño de hash, habrá colisiones en los valores de hash truncados. Ya no está ni cerca de ser poco realista, sucede todo el tiempo.
Deberíamos aumentar la abreviatura predeterminada que era irrealmente pequeña, y agregar una manera para que las personas configuren su propio proyecto por defecto en el archivo de configuración de git.
Estas formas cortas son solo para simplificar el reconocimiento visual y para hacer su vida easier . Git realmente no trunca nada, internamente todo se manejará con el valor completo. Puede usar un SHA-1 parcial a su conveniencia, aunque:
Git es lo suficientemente inteligente como para descubrir qué tipo de compromiso se supone que debe escribir si proporciona los primeros caracteres, siempre que su SHA-1 parcial tenga al menos cuatro caracteres de largo e inequívoco, es decir, solo un objeto en el repositorio actual comienza con que SHA-1 parcial.
Tengo un repositorio que tiene un commit con un id de 000182eacf99cde27d5916aa415921924b82972c
.
git show 00018
muestra la revisión, pero
git show 0001
huellas dactilares
error: short SHA1 0001 is ambiguous.
error: short SHA1 0001 is ambiguous.
fatal: ambiguous argument ''0001'': unknown revision or path not in the working tree.
Use ''--'' to separate paths from revisions
(Si tienes curiosidad, es un clon del repositorio git para git en sí mismo; ese compromiso es uno que Linus Torvalds hizo en 2005).