Permítanme explorar por qué este es un problema desafiante usando los componentes internos de git. Puede obtener el sha1 de la confirmación actual mediante
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
Esencialmente ejecuta una suma de comprobación sha1 en el mensaje devuelto por git cat-file commit HEAD
. Dos cosas saltan inmediatamente como un problema cuando examinas este mensaje. Uno es el árbol sha1 y el segundo es el tiempo de confirmación.
Ahora, el tiempo de confirmación se soluciona fácilmente alterando el mensaje y adivinando cuánto tiempo lleva realizar una confirmación o una programación para confirmar en un momento específico. El verdadero problema es el árbol sha1, del que puede obtener git ls-tree $(git write-tree) | git mktree
. Esencialmente, está haciendo una suma de verificación sha1 en el mensaje de ls-tree, que es una lista de todos los archivos y su suma de verificación sha1.
Por lo tanto, su suma de comprobación commit sha1 depende de la suma de comprobación de su árbol sha1, que depende directamente de la suma de comprobación de archivos sha1, que completa el círculo y depende de commit sha1. Por lo tanto, tiene un problema circular con las técnicas disponibles para mí.
Con sumas de verificación menos seguras , se ha demostrado que es posible escribir la suma de verificación del archivo en el mismo archivo mediante fuerza bruta; sin embargo, no conozco ningún trabajo que haya logrado esa tarea con sha1. Esto no es imposible, pero casi imposible con nuestra comprensión actual (pero quién sabe, tal vez en un par de años será trivial). Sin embargo, esto es aún más difícil de aplicar debido a la fuerza bruta, ya que tiene que escribir la suma de verificación (commit) de una suma de verificación (árbol) de una suma de verificación (blob) en el archivo.