Je suis descendu dans un lapin après que les autres réponses m'ont échoué et j'ai réussi à comprendre que ma version de tar (1.27.1 du repo openSUSE 42.3 OSS) utilisait le pax
format d'archivage non déterministe par défaut, ce qui signifie que même sans compression, (et même en définissant explicitement le mtime) les archives créées avec tar à partir des mêmes fichiers seraient différentes:
$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
Notez que la sortie ci-dessus diffère, même si aucune compression n'est utilisée ; le contenu de l'archive non compressé (généré en exécutant tar deux fois sur le même contenu) est différent, de sorte que le contenu compressé sera également différent même lors de l'utilisation GZIP=-n
comme le suggèrent d'autres réponses
Pour contourner cela, vous pouvez spécifier --format gnu
:
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
Cela fonctionne avec la suggestion de gzip ci-dessus:
# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d test.file.tgz
Cependant, en plus des raisons valables de préférer de meilleurs formats de compression à gzip , vous voudrez peut-être envisager d'utiliser xz à la place (que tar prend également en charge avec les drapeaux --xz
ou à la -J
place de -z
), car cela vous évite une étape ici; le comportement par défaut de xz
est de générer la même sortie compressée lorsque le contenu non compressé est le même, il n'est donc pas nécessaire de spécifier une option comme GZIP=-n
:
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
touch filename
qui change l'heure modifiée d'un fichier suffit à changer la somme de contrôle.