Solo estoy expandiendo la respuesta por @Leif Gruenwoldt
y detallando lo que está en el reference provisto por @Leif Gruenwoldt
hágalo usted mismo ..
- Paso 1. Crear un documento de texto vacío (nombre no importa) en su repositorio
- Paso 2. Etapa y confirma el documento
- Paso 3. Identifique el hash del blob ejecutando
git ls-tree HEAD
- Paso 4. Encuentre el hash del blob para ser
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Paso 5. Snap fuera de su sorpresa y leer a continuación
¿Cómo calcular GIT sus cometer hashes
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
El texto blob⎵
es un prefijo constante y \0
también es constante y es el NULL
personaje. El <size_of_file>
y <contents_of_file>
varían según el archivo.
¡Y eso es todo!
¡Pero espera!, ¿ha notado que el <filename>
no es un parámetro utilizado para el cálculo hash? Dos archivos podrían tener el mismo hash si sus contenidos son indiferentes a la fecha y hora en que fueron creados y su nombre. Esta es una de las razones por las que Git maneja movimientos y cambia el nombre mejor que otros sistemas de control de versiones.
hágalo usted mismo (Ext)
- Paso 6. Crear otro archivo vacío con una diferente
filename
en el mismo directorio
- Paso 7. Comparar los hashes de los dos archivos.
Nota:
El enlace no menciona cómo se hash del objeto tree
. No estoy seguro del algoritmo y parámetros Sin embargo, desde mi observación es probable que calcula un hash basado en todos los blobs
y trees
(sus valores hash probablemente) que contiene
Consulte [asignación de Git SHA1 sin Git] (http://stackoverflow.com/questions/552659/assigning-git-sha1s-without-git) – sanmai
Para obtener más información, también consulte http://progit.org/book /ch9-2.html – netvope
El enlace de netvope parece estar muerto ahora. Creo que esta es la nueva ubicación: http://git-scm.com/book/es/Git-Internals-Git-Objects que es §9.2 de http://git-scm.com/book – Rhubbarb