Si va a construir, digamos, una estructura de directorio donde se nombra un directorio para una confirmación en un repositorio de Git, y desea que sea lo suficientemente corto como para que sus ojos no sangren, pero lo suficientemente largo como para que la posibilidad de que choque sería insignificante, ¿cuánto de la subcadena SHA generalmente se requiere?
Digamos que quiero identificar de manera única este cambio: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Puedo usar tan poco como los primeros cuatro caracteres: https://github.com/wycats/handlebars.js/commit/e629
Pero siento que eso sería arriesgado. Pero suponiendo una base de código que, durante un par de años, podría tener, digamos, 30 mil cambios, ¿cuáles son las posibilidades de colisión si uso 8 caracteres? 12? ¿Hay un número que generalmente se considera aceptable para este tipo de cosas?
Respuestas:
Esta pregunta se responde realmente en el Capítulo 7 del libro Pro Git :
7 dígitos es el valor predeterminado de Git para un SHA corto, por lo que está bien para la mayoría de los proyectos. El equipo de Kernel ha aumentado el suyo varias veces, como se mencionó, porque tienen varios cientos de miles de confirmaciones. Entonces, para sus confirmaciones de ~ 30k, 8 o 10 dígitos deberían estar perfectamente bien.
fuente
git
es bastante inteligente cuando se trata de esto. Puede establecer la abreviatura corta, digamos a 4, ygit
va a utilizar 4 dígitos para el mayor número de hashes que puede, pero el interruptor a 5 o más cuando se sabe que la abreviatura no es única ...Nota: puede solicitar
git rev-parse --short
el SHA1 más corto y único.Consulte " git get hash corto de hash regular "
Para repositorios grandes, 7 no es suficiente desde 2010, y comete dce9648 por el propio Linus Torvalds (git 1.7.4.4, oct 2010):
(BK = BitKeeper)
environment.c
: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 a71f09fMás recientemente, Linus agregó en commit e6c587c (para Git 2.11, Q4 2016):
(como se menciona en la respuesta de Matthieu Moy )
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 .
fuente
core.abbrevLength
ha cambiado el nombre acore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
para generar 10 caracteres. ESTAMOS utilizandogit log -1 --format=%h
, pero eso solo generó 7 caracteres y tuvimos una colisión.Esto se conoce como el problema del cumpleaños.
Para probabilidades menores a la mitad, la probabilidad de una colisión puede ser aproximada como
p ~ = (n 2 ) / (2m)
Donde n es el número de elementos ym es el número de posibilidades para cada elemento.
El número de posibilidades para una cadena hexadecimal es 16 c donde c es el número de caracteres.
Entonces, para 8 personajes y 30K confirmaciones
30K ~ = 2 15
p ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛
Incrementándolo a 12 caracteres
p ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19
fuente
Esta pregunta ha sido respondida, pero para cualquiera que busque las matemáticas detrás, se llama problema de cumpleaños ( Wikipedia ).
Se trata de la probabilidad de que 2 (o más) personas del grupo de N personas cumplan años el mismo día del año. Lo cual es analógico a la probabilidad de 2 (o más) confirmaciones git del repositorio que tienen N confirmaciones en total que tienen el mismo prefijo hash de longitud X.
Mira la tabla de probabilidad . Por ejemplo, para la cadena hexadecimal hash de longitud 8, la probabilidad de tener una colisión alcanza el 1% cuando el repositorio tiene aproximadamente 9300 elementos (git commits). Para 110 000 commits, la probabilidad es del 75%. Pero si tiene una cadena hexadecimal hash de longitud 12, la probabilidad de colisión en 100.000 confirmaciones es inferior al 0.1%.
fuente
La versión 2.11 de Git (¿o quizás 2.12?) Contendrá una función que adapte el número de caracteres utilizados en los identificadores cortos (por ejemplo
git log --oneline
) al tamaño del proyecto. Una vez que use dicha versión de Git, la respuesta a su pregunta puede ser "elija la longitud que le dé Gitgit log --oneline
, es lo suficientemente seguro".Para obtener más detalles, consulte ¿Cómo cambiar el valor predeterminado para "core.abbrev"? discusión en Git Rev News edición 20 y commit bb188d00f7 .
fuente