Timestamps

反复壓縮新創建但相同的文件,但是 zip 的 shasum 不斷變化

  • February 5, 2015

這是我反复壓縮同一個文件夾的文件的後續行動,但 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

檢查stringszip 文件上的命令輸出:

$ strings test.zip blah.zip                         
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
.gitshaPK
QH;F
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
QH;F
.gitshaPK

三個字元串的內容保持不變,但順序發生了變化。因此,zip 文件的某些組件可能不完全依賴於順序。當我可以確定如何使輸出保持不變時,我會更新。

zip 命令附加到輸出 zip 文件。嘗試在執行之間刪除它。


更新:我為自己測試了 -X,它似乎仍然在文件中插入了文件時間戳(如中所示unzip -l

如果您查看wikipedia 上的協議,您會發現日期和時間欄位始終存在,然後在標題的末尾它們為特定於作業系統的欄位留出空間。我會說 -X 忽略了那些特定於作業系統的額外欄位。

因此,我認為生成一致的 zip 文件的唯一方法是使用一致的時間戳。在將文件添加到 zip 文件之前,您可以嘗試將文件觸摸到特定日期。

引用自:https://unix.stackexchange.com/questions/181099