ver tipos tag sirve qué para oneline nos modificados log existen etiquetas cuando crear creamos archivos git ant zip gzip sha

git - tipos - ¿Por qué Zipping el mismo contenido dos veces da dos archivos con SHA1 diferente?



¿para qué nos sirve el sha-1 cuando creamos tags? (2)

Me he encontrado con un problema extraño con los archivos git y zip. Mi script de construcción toma un montón de documentación en páginas html y las comprime en un archivo docs.zip. Luego miro este archivo en git.

El problema que tengo es que cada vez que vuelvo a ejecutar el script de compilación y obtengo un nuevo archivo zip, el nuevo archivo zip tiene un SHA1 diferente al de la ejecución anterior. Mi script de construcción está llamando a la tarea zip de hormiga. Sin embargo, llamar manualmente al zip de macOSX desde el shell de Mac OS X me da un sha1 diferente si cierro el mismo directorio dos veces.

Ejecutar 1:

zip foo.zip * openssl sha1 foo.zip rm foo.zip

Ejecutar 2:

zip foo.zip * openssl sha1 foo.zip

Ejecutar 1 y ejecutar2 dan SHA1 diferente a pesar de que el contenido no cambió entre ejecuciones. En ambos casos, zip imprime exactamente los mismos archivos que se comprimen, no indica que se estén incluyendo archivos específicos del sistema operativo como .DS_Store en el archivo comprimido.

¿El algoritmo de zip es determinista? Si se ejecuta en el mismo contenido, ¿producirá exactamente los mismos bits? ¿si no, porque no?

¿Cuáles son mis opciones para comprimir los archivos de una manera determinista? Hay miles de ellos en el archivo comprimido, no espero que esos archivos cambien demasiado. Sé que git cerrará todos los archivos que registras pero la motivación para comprimirlos es mantener a la mayoría de ellos fuera del camino.


Según la Wikipedia http://en.wikipedia.org/wiki/Zip_(file_format) parece que los archivos zip tienen encabezados para la hora de la última modificación del archivo y la fecha de la última modificación del archivo, por lo que cualquier archivo comprimido que se haya registrado en git parecerá que git ha cambiado si el zip se reconstruye desde el mismo contenido desde entonces. Y parece que no existe una bandera que le diga que no establezca esos encabezados.

Estoy recurriendo simplemente al uso de tar, parece producir los mismos bytes para la misma entrada si se ejecuta varias veces.


gzip tiene la opción -n, puedes hacer:

%> tar cv foo/ | gzip -n > foo.tgz; sha256sum foo.tgz

y obtendrá consistentemente el mismo hash