Saya menjalankan tes membuat dua tars dari dir yang sama (file-nya tetap tidak berubah), dan saya menemukan bahwa md5sums mereka berbeda. Saya berasumsi ada beberapa cap waktu yang dimasukkan dalam header tar, tapi saya belum menemukan cara untuk menimpanya. OS saya adalah Ubuntu 9.1. Ada ide?
Terima kasih.
touch filename
yang mengubah waktu file yang diubah sudah cukup untuk mengubah checksum.Jawaban:
Seperti yang ditunjukkan Dennis di atas, ini gzip. Bagian dari header gzip adalah waktu mod untuk apa pun yang dikompres dalam file. Jika Anda membutuhkan gzip, Anda dapat mengompres tarfile sebagai langkah ekstra di luar tar daripada menggunakan gzip internal tar. Perintah gzip memiliki bendera untuk menekan penghematan waktu modifikasi itu.
Ini tidak akan mempengaruhi waktu di dalam tarfile, hanya yang ada di header gzip.
sumber
GZIP=-n tar -cz ...
Untuk membuat file tar dengan checksum yang konsisten, cukup tambahkan sebelumnya
GZIP=-n
seperti ini:Cara kerjanya: Tar dapat menerima opsi gzip menggunakan
GZIP
variabel lingkungan sementara , seperti di atas. Seperti kata Valter, tar menggunakan gzip, yang secara default menempatkan timestamp di arsip. Ini berarti Anda mendapatkan checksum yang berbeda ketika Anda mengompres file yang sama. The-n
pilihan menonaktifkan timestamp itu.sumber
Saya punya masalah ini juga, untuk membuat gzip tidak mengubah timestamp, gunakan
gzip -n
-n, --no-name tidak menyimpan atau mengembalikan nama asli dan cap waktu
Contoh:
sumber
Saya pergi ke lubang kelinci setelah jawaban yang lain gagal, dan berhasil mengetahui bahwa versi tar saya (1.27.1 dari repo openSUSE 42.3 OSS) menggunakan
pax
format arsip non-deterministik secara default, yang berarti bahwa bahkan tanpa kompresi, (dan bahkan mengatur mtime secara eksplisit) arsip yang dibuat dengan tar dari file yang sama akan berbeda:Perhatikan bahwa output di atas berbeda, meskipun tidak ada kompresi yang digunakan ; konten arsip yang tidak dikompres (dihasilkan dengan menjalankan tar dua kali pada konten yang sama) berbeda, sehingga konten yang dikompresi juga akan berbeda bahkan ketika menggunakan
GZIP=-n
seperti jawaban lain menyarankanUntuk menyiasatinya, Anda dapat menentukan
--format gnu
:Ini berfungsi dengan saran tentang gzip di atas:
Namun, selain alasan yang sah untuk lebih memilih format kompresi yang lebih baik daripada gzip , Anda mungkin ingin mempertimbangkan untuk menggunakan xz sebagai gantinya (yang tar juga mendukung dengan
--xz
atau-J
tanda bukannya-z
), karena itu menghemat langkah Anda di sini; perilaku defaultxz
adalah untuk menghasilkan output terkompresi yang sama ketika konten terkompresi adalah sama, sehingga tidak perlu menentukan opsi sepertiGZIP=-n
:sumber