2011-08-19 7 views
47

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.¿Cómo maneja Git (Hub) posibles colisiones de SHA cortos?

E.g. git show 962a9e8

E.g. https://github.com/joyent/node/commit/962a9e8

Dado que el espacio de posibilidad ahora es de órdenes de magnitud inferior, "solo" 268 million, ¿cómo protegen Git y GitHub contra colisiones aquí? ¿Y cómo los manejan?

+1

Esto no sería una preocupación en el nivel de GitHub porque los sha1 son únicos para cada proyecto individual. – Tone

+14

Todavía es completamente posible que dos sha1s cortos de 7 caracteres colisionen en un solo proyecto. –

+0

¿Alguien sabe si es posible tomar commits a través de la API de github con SHA corto ... Por ejemplo, https://github.com/alexnaspo/var_dumpling-chrome/commit/9e9726ac devuelve la confirmación que necesito, pero https://api.github.com/repos/alexnaspo/var_dumpling-chrome/git/commits/9e9726ac no –

Respuesta

54

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. Sin embargo, puede usar un SHA-1 parcial a su conveniencia:

Git es lo suficientemente inteligente como para descubrir qué cometido debe escribir si proporciona los primeros caracteres, siempre que su SHA-1 parcial sea al menos cuatro caracteres largos y no ambiguos, es decir, solo un objeto en el repositorio actual comienza con ese SHA-1 parcial.

+11

Gracias! Ese enlace explica aún más: "Git puede descifrar una abreviación única y corta para sus valores SHA-1. Si pasa' --abbrev-commit' al comando git log, la salida usará valores más cortos pero los mantendrá únicos; utiliza por defecto siete caracteres, pero los hace más largos si es necesario para mantener el SHA-1 inequívoco ". –

+9

Otra cita útil: "Generalmente, de ocho a diez caracteres son más que suficientes para ser únicos dentro de un proyecto. Uno de los mayores proyectos de Git, el kernel de Linux, está empezando a necesitar 12 caracteres de los 40 posibles para mantenerse únicos". –

+0

Su enlace está roto ... :( – Mrchief

28

Tengo un repositorio que tiene una confirmación con un ID de 000182eacf99cde27d5916aa415921924b82972c.

git show 00018 

muestra la revisión, pero

git show 0001 

impresiones

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, que es un clon del repositorio git para git sí; que cometen es uno que Linus Torvalds hizo en 2005.)

+6

Si necesita saber qué objetos coinciden con su ID ambigua ('0001' en este caso), puede hacer' git rev-list --todos --objetos | grep^0001'. Después de tener una lista de posibles SHA1 completos, puede hacer 'git show' para cada uno. –

+0

[Esta respuesta] (http://stackoverflow.com/a/27428930/841555) muestra cómo desambiguar utilizando solo un comando git. – Jeremy

10

Dos notas aquí:

  • Si escribe y cualquier lugar de la página de GitHub mostrar una confirmación, podrás ver los 40 bytes completos de dicho cometió.
    Eso ilustra el punto de emboss: GitHub no trunca nada.

  • Y 7 bits no es suficiente desde 2010 de todos modos.
    Ver commit dce9648 por el propio Linus Torwalds (oct 2010, Git 1.7.4.4):

El valor por defecto de 7 viene de bastante temprano en el desarrollo git, cuando siete dígitos hexadecimales era mucho (Cubre alrededor Más de 250 millones de valores hash). En aquel entonces, pensaba que las revisiones de 65k eran muchas (era lo que estábamos a punto de alcanzar en BK), y cada revisión suele ser de unos 5-10 objetos nuevos, así que un millón de objetos era un número grande.

(BK = Bitkeeper)

En estos días, el núcleo no es ni siquiera el proyecto Git más grande, e incluso el núcleo tiene unos 220k revisiones ( mucho más grande que el árbol BK nunca fue) y nos acercamos a dos millones de objetos. En ese punto, siete dígitos hexadecimales siguen siendo ú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 hash, habrá colisiones en valores hash truncados. Ya no está ni cerca de ser poco realista, sucede todo el tiempo.

Ambos deberíamos aumentar la abreviatura predeterminada que era poco realista, y agregar una forma para que las personas establezcan su propio proyecto por defecto en el archivo de configuración de git.

+0

Perspicaz. Gracias! –

+0

Tengo curiosidad, ¿cuál * es * el proyecto de git más grande? O al menos, cuáles son algunos de los mejores ejemplos de repositorios git absolutamente masivos? – GMA

+1

@GeorgeMillo Como se menciona en http://blogs.atlassian.com/2014/05/handle-big-repositories-git/, tiene 2 tipos de grandes repos (gran historia, o enormes binarios) Un ejemplo de enorme git repo fue el de Facebook: https://news.ycombinator.com/item?id=7648237 (cambiaron desde entonces a su propia versión de Mercurial) – VonC

Cuestiones relacionadas