次のように同じ構造と内容を持つ2つの同じフォルダがあります。
folder_1
hello.txt
subfolder
byebye.txt
folder_2
hello.txt
subfolder
byebye.txt
tar.xz形式に圧縮すると、ファイルサイズが異なる2つの異なるアーカイブが作成されます(わずか数バイトしかありませんが、同じではありません)。
$ cd folder_1 && tar -Jcf archive.tar.xz *
$ cd folder_2 && tar -Jcf archive.tar.xz *
私は得る:
folder_1/archive.tar.xz != folder_2/archive.tar.xz
もちろん、私や彼らは、md5sum
2sha1sum
つの異なるハッシュを取得します。
私の問題は次のとおりです。提供されたアーカイブが私のリポジトリのアーカイブと同じであることを確認する必要があります。ハッシュは利用できず、ファイルサイズのみを確認することはできません。
tar.xzの代わりにzipを使用すると、zipは常に同じファイルから同じアーカイブを生成するため、問題はありません。なぜこれが起こるのですか?それを防ぐ方法はありますか?
答え1
さて、ddnomadによって提供された説明は正しいです。タイムスタンプについてです。
解決策は次のとおりです。
--mtime='1970-01-01 00:00:00'
tar コマンドに追加:
tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *
これにより、コンテンツタイムスタンプが固定値に強制され、同じアーカイブが作成されます。
答え2
同じディレクトリツリーの2つのタールボールが異なる理由はいくつかあります。以下があります:
所有権、タイムスタンプなどのメタデータは異なる場合があります。コピー可能なtarアーカイブを取得するには、同じ所有権、権限、およびタイムスタンプが必要です。すべてのメタデータをコピーしたことを確認してください。ファイルの内容は同じで、メタデータは異なる場合に
cp -a --attributes-only
役立ちます。 GNU tar では、いくつかのオプションを使用して特定の属性を上書きできます。--numeric-owner
名前は保存されず、数字のユーザーとグループIDのみが保存されます。--owner
そして、--group
ファイルが特定のユーザーとグループにそれぞれ書き込まれるように強制します(たとえば、--owner=0 --group=0
すべてのファイルをルートに属するものとして記録します)。--set-mtime
実際のタイムスタンプの代わりに、特定のタイムスタンプを持つすべてのファイルを保存できます。
ファイルが保存される順序は異なる場合があります。ほとんどのファイルシステムは、ファイルがディレクトリにリストされている順序と、ファイルが表示されるとおりにリストされる
tar
順序を特に保証しません。 (コマンドで見ることができますls -U
。)GNU tar 1.28には新しいオプションがあります--sort=name
。以前のバージョンや他の実装では、ソートされたファイル名のリストを作成してtarに渡して、再現可能なファイルの順序を取得できます。find . -print0 | LC_ALL=C sort -z | tar --no-recursion -Jcf ../archive.tar.xz -T -
あなたは興味があるかもしれません再現可能なビルドに関するDebian Wikiページ。
答え3
すべてのファイル(フォルダもファイルです)にはタイムスタンプが組み込まれています。
これらのフォルダ構造を同時に作成することはできないと思うので、これらのファイルのタイムスタンプは異なります。
したがって、アーカイブまたはハッシュは、タイムスタンプが両方のジョブで使用されるファイルの一部であるため、異なる結果を提供します。
これは、見かけ上同じように見えるファイル構造の違いです。
更新:同様の内容があることを確認したら、実際にこれらのファイルの内容を確認して比較する必要があるようです。