2012-03-15 26 views
9

Tôi gặp sự cố lạ với tệp git và zip. Xây dựng kịch bản của tôi mất một loạt các trang html tài liệu và nén chúng vào một docs.zip tôi sau đó kiểm tra tập tin này vào git.Tại sao việc nén cùng một nội dung hai lần cung cấp hai tệp với SHA1 khác nhau?

Sự cố tôi gặp phải là mỗi khi tôi chạy lại tập lệnh xây dựng và nhận tệp zip mới, tệp zip mới có SHA1 khác với lần chạy trước đó. Kịch bản xây dựng của tôi đang gọi nhiệm vụ ant zip. Tuy nhiên, thủ công gọi là zip macOSX từ hệ vỏ Mac OS X mang lại cho tôi một sha1 khác nếu tôi nén cùng một thư mục hai lần.

Run 1:

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

Run 2:

zip foo.zip * 
openssl sha1 foo.zip 

Run 1 và run2 cho khác nhau SHA1 mặc dù nội dung không thay đổi giữa chạy. Trong cả hai trường hợp, zip in ra chính xác các tệp giống nhau được nén nó không chỉ ra rằng bất kỳ tệp hệ điều hành cụ thể nào như .DS_Store đang được đưa vào tệp nén.

Định lý sổ sách zip có xác định không? Nếu chạy trên cùng một nội dung nó sẽ tạo ra chính xác cùng một bit? nếu không, tai sao không?

Tôi có lựa chọn nào để nén các tệp theo cách xác định? Có hàng ngàn người trong số họ trong tập tin nén, tôi không mong đợi những tập tin đó thay đổi nhiều. Tôi biết rằng git sẽ zip lên bất kỳ tập tin bạn checkin nhưng động lực để zip chúng là chỉ giữ cho khối lượng của chúng ra khỏi con đường.

+2

Hai thứ. Đầu tiên có vẻ như bản thân tệp zip có thể được bao gồm trong zip vì nó nằm trong cùng thư mục, có thể cung cấp kết quả không xác định. Thứ hai, mã zip có thể bao gồm ngày và giờ sẽ khác với ngày chạy. –

+0

tệp zip không được bao gồm trong zip mới được tạo, tôi đã kiểm tra trước khi đăng câu hỏi của mình. – ams

Trả lời

8

Theo Wikipedia http://en.wikipedia.org/wiki/Zip_(file_format) vẻ như file zip có tiêu đề cho tập tin thời gian sửa đổi cuối cùng và File ngày sửa đổi cuối cùng vì vậy bất kỳ tập tin zip kiểm tra vào git sẽ xuất hiện để git như đã thay đổi nếu zip được xây dựng lại từ cùng một nội dung kể từ đó. Và có vẻ như không có lá cờ để bảo nó không đặt những tiêu đề đó.

Tôi đang sử dụng chỉ để sử dụng tar, có vẻ như sản xuất cùng một byte cho cùng một đầu vào nếu chạy nhiều lần.

+0

Đúng vậy, kho lưu trữ ZIP bao gồm các thông tin tệp khác nhau, bao gồm thời gian sửa đổi tệp (và đối với các quyền của tệp unix, chủ sở hữu, thời gian tạo và thời gian truy cập sự kiện). –

7

Theo mặc định, gzip tiết kiệm tên file và thời gian tem

%> 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 

Sử dụng tùy chọn -n:

%> tar cv foo/ | gzip -n > foo.tgz; shasum foo.tgz # sha256sum on Ubuntu 

bạn sẽ luôn có được cùng bảng băm.

Thử ở trên mà không cần -n và bạn sẽ thấy một hàm băm khác nhau mỗi lần.

+4

Đây là câu trả lời đúng, nhưng sẽ hữu ích nếu bạn nói cho người dùng biết nó làm gì và cách giải quyết vấn đề. Từ gzip trợ giúp "-n --no-name Khi nén, không lưu tên tệp gốc và dấu thời gian theo mặc định ..." Tên tệp gốc đã lưu ảnh hưởng đến băm. –

Các vấn đề liên quan