ams*_*ams 17 git ant zip gzip sha
我遇到了一个git和zip文件的奇怪问题.我的构建脚本需要一堆文档html页面并将它们压缩成docs.zip然后我将此文件检入git.
我遇到的问题是每次我重新运行构建脚本并获得一个新的zip文件时,新的zip文件具有与上一次运行不同的SHA1.我的构建脚本正在调用ant zip任务.然而,如果我将同一目录压缩两次,那么从Mac OS X shell手动调用macOSX zip会给我一个不同的sha1.
运行1:
zip foo.zip *
openssl sha1 foo.zip
rm foo.zip
Run Code Online (Sandbox Code Playgroud)
运行2:
zip foo.zip *
openssl sha1 foo.zip
Run Code Online (Sandbox Code Playgroud)
运行1和run2给出不同的SHA1,即使内容在运行之间没有变化.在这两种情况下,zip都会打印出完全相同的压缩文件,但并不表示任何特定于操作系统的文件(如.DS_Store)都包含在zip文件中.
zip算法是否具有确定性?如果在相同的内容上运行它会产生完全相同的位吗?如果不是为什么不呢?
我有哪些选择以确定的方式压缩文件?压缩文件中有数千个,我不希望这些文件发生太大变化.我知道git会压缩你检查的任何文件,但拉链它们的动机就是保持它们的质量不受影响.
ams*_*ams 12
根据维基百科http://en.wikipedia.org/wiki/Zip_(file_format)似乎zip文件有文件最后修改时间标头和文件的最后修改日期,以便签入任何Git的zip文件会出现的Git已经改变,如果从那以后,从同一内容重建zip.似乎没有标志告诉它不设置这些标题.
我只是使用tar,如果多次运行,它似乎为相同的输入产生相同的字节.
chi*_*her 10
默认情况下,gzip保存文件名和时间戳
%> gzip -help 2>&1 | grep -e '-n'
-N --name save or restore original file name and time stamp
-n --no-name don't save original file name or time stamp
%> gzip -V
Apple gzip 272
Run Code Online (Sandbox Code Playgroud)
使用-n选项:
%> tar cv foo/ | gzip -n > foo.tgz; shasum foo.tgz # sha256sum on Ubuntu
Run Code Online (Sandbox Code Playgroud)
你会一直得到相同的哈希值.
在没有-n的情况下尝试上面,每次都应该看到不同的哈希.
我成功地使用-X( --no-extra) 标志创建了具有相同 SHA1 的文件zip。
我创建了一个文件夹和几个要压缩的文件来测试它,并且正如预期的那样,每次都获得不同的 SHA1 哈希值:
$ mkdir stuff
$ echo "Stuff 1" > stuff/stuff1.txt
$ echo "Stuff 2" > stuff/stuff2.txt
$ zip -r stuff.zip stuff/
adding: stuff/ (stored 0%)
adding: stuff/stuff1.txt (stored 0%)
adding: stuff/stuff2.txt (stored 0%)
$ shasum stuff.zip
1c8be43ac859bb57603be1243da14022710d22bd stuff.zip
$ shasum stuff.zip
1c8be43ac859bb57603be1243da14022710d22bd stuff.zip
$ zip -r stuff.zip stuff/
updating: stuff/ (stored 0%)
updating: stuff/stuff1.txt (stored 0%)
updating: stuff/stuff2.txt (stored 0%)
$ shasum stuff.zip
73920362d0f7de74d87286502e03e7126fdc0a6a stuff.zip
Run Code Online (Sandbox Code Playgroud)
但是,使用-X在连续压缩后得到相同的哈希值:
$ zip -r -X stuff.zip stuff/
updating: stuff/ (stored 0%)
updating: stuff/stuff1.txt (stored 0%)
updating: stuff/stuff2.txt (stored 0%)
$ shasum stuff.zip
1ed228b16d1ee803f26a8b1419f2eb3bf7fcb9f5 stuff.zip
$ zip -r -X stuff.zip stuff/
updating: stuff/ (stored 0%)
updating: stuff/stuff1.txt (stored 0%)
updating: stuff/stuff2.txt (stored 0%)
$ shasum stuff.zip
1ed228b16d1ee803f26a8b1419f2eb3bf7fcb9f5 stuff.zip
Run Code Online (Sandbox Code Playgroud)
我没有时间深入研究并找出在第一种情况下导致差异弹出的额外信息,但这可能对试图解决它的人有所帮助。也仅在 macOS 10.12.6 上测试过。
| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |