git tag Почему Zipping одного и того же контента дважды дает два файла с разными SHA1?




github tags (2)

У меня возникла странная проблема с файлами git и zip. Мой скрипт сборки содержит кучу документации html-страниц и застегивает их в docs.zip. Затем я проверяю этот файл на git.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я повторно запускаю скрипт сборки и получаю новый zip-файл, новый zip-файл имеет другой SHA1, чем предыдущий. Мой скрипт сборки вызывает задачу ant zip. Однако при ручном вызове macOSX zip из оболочки Mac OS X у меня есть другой sha1, если я дважды закрою один и тот же каталог.

Запуск 1:

zip foo.zip *
openssl sha1 foo.zip 
rm foo.zip 

Выполнить 2:

zip foo.zip *
openssl sha1 foo.zip

Run 1 и run2 дают разные SHA1, даже если контент не менялся между прогонами. В обоих случаях zip печатает точно такие же файлы, которые были заархивированы, но не указывает на то, что в zip-файл включены любые файлы, относящиеся к ОС, такие как .DS_Store.

Является ли алгоритм zip-алгоритма детерминированным? Если он запускается на одном и том же содержимом, он будет воспроизводить точно такие же биты? если нет, то почему?

Каков мой выбор для депинификации файлов? Есть тысячи из них в zipped-файле, я не ожидаю, что эти файлы сильно изменятся. Я знаю, что git будет заархивировать любые файлы, которые вы проверите, но мотивация их застегивать - просто держать их в стороне.


Согласно Wikipedia http://en.wikipedia.org/wiki/Zip_(file_format), кажется, что в zip-файлах есть заголовки для времени последней модификации файла и даты последней модификации файла, поэтому любой zip-файл, установленный в git, по-видимому, будет изменен, если zip с момента его создания перестраивается из одного и того же контента. И кажется, что нет никакого флага, чтобы сказать ему, чтобы не устанавливать эти заголовки.

Я прибегаю к использованию tar, он, похоже, создает одни и те же байты для одного и того же ввода, если выполняется несколько раз.


gzip имеет параметр -n, вы можете сделать:

%> tar cv foo/ | gzip -n > foo.tgz; sha256sum foo.tgz

и вы будете последовательно получать один и тот же хеш





sha