2011-11-03 10 views
46

Kịch bảnGit có thể coi các tệp zip là các thư mục và tệp trong zip dưới dạng các đốm màu không?

Hãy tưởng tượng tôi buộc phải làm việc với một số tệp của tôi luôn được lưu trữ bên trong .zip tệp. Một số tệp trong zip là các tệp văn bản nhỏ và thường xuyên thay đổi, trong khi các tệp khác lớn hơn nhưng may mắn thay vì tĩnh (ví dụ: hình ảnh).

Nếu tôi muốn đặt các tệp zip này trong kho lưu trữ git, mỗi zip được coi là blob, vì vậy bất cứ khi nào tôi cam kết kho lưu trữ sẽ tăng kích thước của tệp zip ... ngay cả khi chỉ có một tệp văn bản nhỏ bên trong đã thay đổi!

Tại sao điều này là thực tế

MS Word 2007/2010 .docx và Excel .xlsx file là file ZIP ...

Những gì tôi muốn

Có, bởi bất kỳ cơ hội, cách để yêu cầu git không coi zips là tệp, mà đúng hơn là thư mục và xử lý nội dung của chúng dưới dạng tệp?

Những lợi thế

Nhưng nó không thể làm việc, bạn nói gì?

Tôi nhận ra rằng không có siêu dữ liệu bổ sung sẽ dẫn đến một số sự mơ hồ: trên git checkout git sẽ phải quyết định có tạo foo.zip/bar.txt làm tệp trong thư mục thông thường hoặc tệp zip hay không. Tuy nhiên điều này có thể được giải quyết thông qua các tùy chọn cấu hình, tôi sẽ nghĩ.

Hai ý tưởng làm thế nào nó có thể được thực hiện (nếu nó chưa hề tồn tại)

  • sử dụng một thư viện như minizip hay IO::Compress::Zip bên git
  • bằng cách nào đó thêm một lớp hệ thống tập tin mà git thực xem các tệp zip dưới dạng thư mục để bắt đầu bằng
+1

Kịch bản với '.docx 'các tệp có ý nghĩa, nhưng trong nhiều trường hợp khác, bạn có thể muốn xem xét việc theo dõi các tệp riêng lẻ thường với git và chỉ * xây dựng * kết quả' .zip' bằng cách sử dụng công cụ xây dựng thích hợp như 'make'. – pixelistik

+0

Xét rằng hai tệp zip trông khác nhau có thể chứa cùng một dữ liệu giống nhau (ví dụ: tệp văn bản nén hai lần với hai mức nén khác nhau), điều này trở nên phức tạp hơn nhiều. Mặc dù dễ dàng thể hiện sự khác biệt giữa hai phiên bản của các tệp đã giải nén với ít thông tin, tôi đoán đại diện cho sự khác biệt giữa hai phiên bản của kho lưu trữ (về cơ bản những gì git phải làm) với ít thông tin sẽ không -không đáng kể. – HelloGoodbye

+0

Bạn đã bao giờ kết thúc với một giải pháp thực hiện [câu trả lời của Jeff] (https://stackoverflow.com/a/8001900/321973) hay bất kỳ điều gì khác? Tôi đang tự hỏi về cơ bản giống nhau ngoại trừ [cho kho lưu trữ tar] (https://stackoverflow.com/q/37000849/321973), mà sẽ mang lại một câu trả lời tương thích ... –

Trả lời

15

này không tồn tại, nhưng nó có thể dễ dàng tồn tại trong khung hiện tại. Cũng giống như git hoạt động khác với hiển thị các tệp nhị phân hoặc ascii khi thực hiện một sự khác biệt, nó có thể được yêu cầu cung cấp điều trị đặc biệt cho các loại tệp nhất định thông qua giao diện cấu hình.

Nếu bạn không muốn thay đổi mã cơ sở (mặc dù đây là một ý tưởng hay), bạn cũng có thể tự mình viết mã bằng cách sử dụng pre-commit and post-checkout hooks để giải nén và lưu trữ tệp, sau đó trả lại chúng trạng thái .zip của họ khi thanh toán. Bạn sẽ phải hạn chế các hành động để chỉ các tệp blobs/chỉ mục được chỉ định bởi git add.

Dù bằng cách nào cũng có một chút công việc - đó chỉ là vấn đề liệu git khác có biết được những gì đang diễn ra và chơi hay không.

+0

Móc làm dường như là một hướng tốt để nhìn vào; Tôi nghĩ ngắn gọn về điều đó nhưng không chắc liệu nó có hiệu quả hay không. Móc trước cam kết có thể sửa đổi cả hệ thống tệp và vùng dàn dựng? –

+1

@Jonas Bạn đã bao giờ kết thúc làm việc này và có khả năng bạn đăng một giải pháp làm việc không? Tôi rất muốn theo dõi chúng tôi một cách hữu ích để thay đổi bảng tính trong git và CSV không phù hợp với mục đích của chúng tôi. – Ruben

+0

Xin lỗi, tôi không bao giờ tự mình theo dõi ... –

2

Tôi nghĩ bạn sẽ cần phải gắn một tệp zip vào hệ thống tệp. Tôi đã không sử dụng nó, nhưng hãy cân nhắc FUSE:

http://code.google.com/p/fuse-zip/

Ngoài ra còn có ZFS dành cho Windows và Linux:

http://users.telenet.be/tfautre/softdev/zfs/

+0

Nếu tôi hiểu chính xác, fuse-zip có thể nằm giữa hệ thống tệp và git, nhưng zfs sẽ phải được tạo * thành * 'git', phải không? Tệ quá, tôi không phải lúc nào cũng theo Linux với repo đó, nếu không thì fuse-zip sẽ là một ý tưởng hay. –

2

Thường xảy ra sự cố với các tệp được nén trước cho các ứng dụng vì chúng mong đợi phương pháp nén zip và thứ tự tệp là phương thức mà chúng đã chọn. Tôi tin rằng các tệp .odf đang mở có vấn đề.

Điều đó nói rằng, nếu bạn chỉ đơn giản là sử dụng bất kỳ zip cũ như một phương pháp để giữ công cụ với nhau mà bạn sẽ có thể tạo một vài bí danh đơn giản sẽ giải nén và tái nén khi cần thiết. Mới nhất Msysgit (aka Git cho Windows) bây giờ có cả zip và giải nén trên phía mã shell để bạn có thể sử dụng chúng trong bí danh.

Dự án tôi hiện đang làm việc trên sử dụng khóa là điều khiển/lưu trữ phiên bản cục bộ chính, vì vậy tôi cũng đang cố gắng tạo một nhóm bí danh khả thi để hút hàng trăm zips này ;-) để các đồng nghiệp rất vui.

+3

Tôi vừa làm một vài thử nghiệm cho Word 2010 - nó có vẻ khá khoan dung ('deflate' với các kích thước từ khác nhau,' deflate64' và thay đổi thứ tự tệp trong tệp zip được tạo bởi 7zip tất cả đã không xóa Word). Về việc sử dụng bí danh, tôi đã hy vọng tránh được thêm bất kỳ bước thủ công nào ... hiện tại hầu hết các cam kết của tôi đều trải qua TortoiseGit. –

9

Sử dụng bup (được trình bày chi tiết trong GitMinutes #24)

Nó chỉ là hệ thống git-như được thiết kế để đối phó với lượng lớn (thậm chí rất rất lớn) các tập tin, có nghĩa là tất cả các phiên bản của một tập tin zip sẽ chỉ tăng repo từ vùng đồng bằng (thay vì bản sao đầy đủ)

Kết quả là một repo git thực tế, mà lệnh Git thông thường có thể đọc.

Tôi chi tiết cách thức bup khác với Git trong "git with large files".


Bất kỳ workaround khác (như git-annex) không phải là hoàn toàn thỏa đáng, như chi tiết trong "git-annex with large files".

+1

Điều này dường như rất nhiều hướng tới các tệp rất lớn, kịch bản được hướng nhiều hơn về XML như docx và xlsx (thường là khá nhỏ) được nén lên. Bạn sẽ nhận được một kích thước repo nhỏ hơn với bup, nhưng bạn sẽ nhận được để thay đổi thực sự khác trong XML? – Ruben

+0

@Ruben này được hướng tới các tệp lớn có kích thước hoặc bằng số. Nhưng nó không khác nhiều so với git về mặt khác biệt. – VonC

+0

Có vẻ thú vị, nhưng bạn có thể sử dụng nó với repo git thực tế của bạn? – kutschkem

5

http://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/

(Lưu ý: mỗi bình luận từ Ruben, điều này chỉ về nhận được một diff thích hợp mặc dù, không phải về cam kết các file đã được giải nén được.)

Mở ~/file .gitconfig của bạn (tạo nếu không tồn tại đã được) và thêm đoạn thơ sau:

[diff "zip"] textconv = unzip -c -a

gì nó d oes đang sử dụng “giải nén -c -a FILENAME” để chuyển đổi mã zip của bạn thành văn bản ASCII (giải nén -c unzips thành STDOUT). Điều tiếp theo là tạo/sửa đổi tệp REPOSITORY/.gitattributes và thêm

* sau.pptx diff = zip

cho git sử dụng mô tả phân biệt zip từ cấu hình cho các tệp tính toán mặt nạ đã cho (trong trường hợp này mọi thứ kết thúc bằng .pptx). Bây giờ git diff tự động giải nén các tệp và phân biệt đầu ra ASCII tốt hơn một chút so với chỉ "tệp nhị phân khác". Mặt khác đối với mớ hỗn độn phức tạp là các tệp pptx XML tương ứng của tệp pptx, nó không giúp ích nhiều cho các tệp ZIP bao gồm văn bản (ví dụ như lưu trữ mã nguồn ví dụ) thực sự là khá .

+0

Đây chỉ là về việc nhận được một sự khác biệt phù hợp mặc dù, không phải về cam kết giải nén các tập tin .. – Ruben

+0

Cảm ơn. Điều này trả lời câu hỏi tôi muốn giải quyết, hiển thị các thay đổi đối với các tệp văn bản bên trong tệp gzip của tôi khi 'git diff'ing. Tôi đã sử dụng '[diff" gzip "] = zcat' và' * .gz diff = gzip'. – spazm

10

Không chắc chắn nếu có ai vẫn quan tâm đến câu hỏi này. Tôi đang phải đối mặt với cùng một vấn đề và đây là giải pháp của tôi sử dụng bộ lọc tập tin git.

Chỉnh sửa: Trước tiên, tôi không thể nói rõ ràng, nhưng điều này IS câu trả lời cho câu hỏi của OP! Đọc toàn bộ câu trước khi bạn bình luận. Hơn nữa, nhờ @Toon Krijthe cho lời khuyên để làm rõ các giải pháp tại chỗ.

Giải pháp của tôi là sử dụng bộ lọc để "phẳng" tệp nén thành tệp văn bản mở rộng nguyên khối (có thể là rất lớn). Trong khi git add/commit, tập tin zip sẽ tự động được mở rộng sang định dạng văn bản này cho việc phân biệt văn bản bình thường, và trong khi thanh toán, nó sẽ tự động được nén lại.

Tệp văn bản bao gồm các bản ghi, mỗi tệp đại diện cho một tệp trong tệp zip. Vì vậy, bạn có thể điều tập tin văn bản này là một hình ảnh dựa trên văn bản cho zip gốc. Nếu tệp trong zip là văn bản trong chứng thư, nó được sao chép vào tệp văn bản; nếu không, nó được mã hóa base64 trước khi được sao chép vào tệp định dạng văn bản. Điều này giữ cho tập tin văn bản luôn là một tập tin văn bản.

Mặc dù bộ lọc này không làm cho mỗi tệp trong zip một blob, tệp văn bản được ánh xạ đường thẳng thành dòng, đó là đơn vị khác, trong khi các thay đổi tệp nhị phân có thể được biểu diễn bằng các bản cập nhật của base64 tương ứng của chúng điều này tương đương với những gì OP tưởng tượng.

Để biết chi tiết và mã mẫu bạn có thể đọc liên kết sau:

Zippey Git file filter

Ngoài ra, tín dụng đến nơi truyền cảm hứng cho tôi về giải pháp này: Description of how file filter works

+0

Bộ lọc này vẫn đang được phát triển, nếu bạn có câu hỏi hoặc bất kỳ đề xuất nào cho tôi biết. – Sippey

+1

Tôi đã thử điều này và tôi nghĩ rằng nó sẽ làm việc tốt cho tôi. Tôi sẽ chỉ thêm một cái gì đó vào tài liệu mà danh sách tệp văn bản zippey.py phải được sửa đổi để bao gồm bất kỳ loại tệp nào bạn muốn zippey.py nhận ra dưới dạng tệp văn bản. – mteng

+0

Bộ lọc này hoạt động tuyệt vời! Cảm ơn rất nhiều vì đã đăng bài này. –