Timestamps
反复壓縮新創建但相同的文件,但是 zip 的 shasum 不斷變化
這是我反复壓縮同一個文件夾的文件的後續行動,但 shasum本質上一直在變化..
當我壓縮我的儲存庫的一部分並獲取它的 sha 總和時,我試圖添加一個包含目前送出的 git sha 的文件。
程式碼是
git rev-parse HEAD > .gitsha
. 但是,將其添加到我的 zip 意味著shasum
我的 zip 每秒左右不斷變化。zip 命令用於-X
忽略文件時間戳。我只嘗試了
.gitsha
下面的文件$ git rev-parse HEAD > .gitsha ; shasum .gitsha 8fa263bc885822ccba03006ea10015ef32da485c .gitsha
隨著時間的推移,這是一致的。
但是壓縮後,
shasum
不再一致$ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip 26cc38c624f91a1c555d503fdfdecb1ce670274f test.zip $ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip b03f7cb654e3aa0d25d18ead5fe1f225bc2aac9f test.zip
這些是相隔幾秒鐘的 2 次試驗。我認為該
-X
標誌可能不包括創建時間?有什麼辦法可以讓它工作嗎?更新:刪除 zip 沒有幫助。
$ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip 76c722ccf2df75fb624f9640ad948f4508dd6152 test.zip $ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip 6bd26d2bc821d9f12806fc81a8ba8c8babcc664a test.zip
檢查
strings
zip 文件上的命令輸出:$ strings test.zip blah.zip .gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9 .gitshaPK QH;F .gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9 QH;F .gitshaPK
三個字元串的內容保持不變,但順序發生了變化。因此,zip 文件的某些組件可能不完全依賴於順序。當我可以確定如何使輸出保持不變時,我會更新。
zip 命令附加到輸出 zip 文件。嘗試在執行之間刪除它。
更新:我為自己測試了 -X,它似乎仍然在文件中插入了文件時間戳(如中所示
unzip -l
)如果您查看wikipedia 上的協議,您會發現日期和時間欄位始終存在,然後在標題的末尾它們為特定於作業系統的欄位留出空間。我會說 -X 忽略了那些特定於作業系統的額外欄位。
因此,我認為生成一致的 zip 文件的唯一方法是使用一致的時間戳。在將文件添加到 zip 文件之前,您可以嘗試將文件觸摸到特定日期。