Solo estoy ampliando la respuesta @Leif Gruenwoldt
y detallando lo que está en la referencia proporcionada por@Leif Gruenwoldt
Hazlo tu mismo..
- Paso 1. Cree un documento de texto vacío (el nombre no importa) en su repositorio
- Paso 2. Etapa y comprometer el documento
- Paso 3. Identifica el hash del blob ejecutando
git ls-tree HEAD
- Paso 4. Encuentra el hash del blob para ser
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Paso 5. Sal de tu sorpresa y lee a continuación
¿Cómo calcula GIT sus hashes de confirmación?
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
carácter. El <size_of_file>
y <contents_of_file>
varían según el archivo.
Ver: ¿Cuál es el formato de archivo de un objeto git commit?
Y eso es todo amigos!
¡Pero espera! , ¿notó que <filename>
no es un parámetro utilizado para el cálculo de hash? Dos archivos podrían tener el mismo hash si su contenido es igual a la fecha y hora en que se crearon y su nombre. Esta es una de las razones por las que Git maneja los movimientos y renombra mejor que otros sistemas de control de versiones.
Hágalo usted mismo (Ext)
- Paso 6. Cree otro archivo vacío con otro diferente
filename
en el mismo directorio
- Paso 7. Compara los hash de tus dos archivos.
Nota:
El enlace no menciona cómo tree
se hashiza el objeto. No estoy seguro del algoritmo y los parámetros, sin embargo, según mi observación, probablemente calcula un hash basado en todo blobs
y trees
(sus hashes probablemente) contiene