2011-01-15 45 views
64

Git có tốt với các tệp nhị phân không?Git có tốt với các tệp nhị phân không?

Nếu tôi có nhiều tệp không nén bị sửa đổi và nhiều tệp được nén không bao giờ được sửa đổi, hoặc sẽ sửa đổi tốt không? Ví dụ, nếu tôi chèn hoặc loại bỏ giữa và chèn dữ liệu gần cuối nó sẽ nhận thấy nó như nó với văn bản?

Nếu git không tốt với tệp nhị phân, tôi có thể xem xét công cụ nào?

+0

rất tốt với nhị phân - tôi tự sử dụng nó – tekknolagi

+0

Đó là sự thật. Bạn có thể đặt/nhà của bạn theo sửa đổi git và nó sẽ làm việc khá tốt. –

+0

Đây không phải là tinh thần của câu hỏi, được ghi nhận rõ ràng là đang quan tâm về việc liệu các tệp nhị phân có phân biệt được thực hiện trên chúng hay không (có thể vì lý do lưu trữ và lý do hiệu suất). Tuy nhiên, tôi đã không downvote nó (và nó xuất hiện bất cứ ai đã có kể từ khi gỡ bỏ nó). – coreyward

Trả lời

2

Vâng git là tốt với nhị phân. Nhưng nó sẽ không xử lý các tệp nhị phân như tệp văn bản. Nó giống như bạn muốn kết hợp các tập tin nhị phân. Tôi có nghĩa là, một sự khác biệt trên một jpeg sẽ không bao giờ trả lại cho bạn bất cứ điều gì. Git hoạt động rất tốt với các tập tin văn bản và có lẽ là xấu như mọi giải pháp khác với các tập tin nhị phân!

4

Tôi không biết bất kỳ công cụ nào cố gắng lưu trữ các tệp nhị phân khác nhau để kiểm soát phiên bản, nhưng đáng lưu ý là Git không thực hiện việc này ngay cả đối với tệp văn bản. Git lưu trữ các tệp dưới dạng blob, và nó có sự khác biệt giữa chúng khi cần.

Nếu bạn đang tìm cách thực hiện điều khiển phiên bản trên một số thứ như tài liệu Photoshop/Illustrator, GridIron Flow có thể thực hiện thủ thuật cho bạn. Nếu bạn đang cố gắng giữ chúng đồng bộ giữa các máy, Dropbox hoặc Rsync có thể xử lý nó, nhưng chúng sẽ không làm việc khác biệt thông minh.

+1

Từ sách cộng đồng git (http://book.git-scm.com/7_how_git_stores_objects. html): "Để tiết kiệm không gian đó, Git sử dụng gói dữ liệu. Đây là một định dạng mà Git sẽ chỉ lưu phần đã thay đổi trong tệp thứ hai, với một con trỏ tới tệp tương tự." –

+2

Vâng, đó là nếu/khi bạn chạy 'git gc' để thực hiện thu gom rác. Từ cùng một trang: "Vì Git lưu trữ mỗi phiên bản của mỗi tệp như một đối tượng riêng biệt, nó có thể trở nên khá kém hiệu quả. Hãy tưởng tượng có một tệp dài vài nghìn dòng và thay đổi một dòng. Git sẽ lưu trữ tệp thứ hai trong toàn bộ, là một sự lãng phí lớn của không gian. " – coreyward

+2

Fair 'nuff. git không làm gc tự động bây giờ và sau đó, ít nhất là cho dự án tôi sử dụng nó cho. Tôi không biết số liệu mà nó sử dụng để quyết định khi nào chạy - có lẽ có những cây sẽ không bao giờ (hoặc hiếm khi) kích hoạt gc. –

28

Ngoài hộp, git có thể dễ dàng thêm các tệp nhị phân vào chỉ mục của nó và lưu trữ chúng một cách hiệu quả trừ khi bạn cập nhật thường xuyên các tệp không nén lớn.

Các vấn đề bắt đầu khi git cần tạo các khác biệt và hợp nhất: git không thể tạo các khác biệt có ý nghĩa hoặc hợp nhất các tệp nhị phân theo bất kỳ cách nào có thể có ý nghĩa. Vì vậy, tất cả các hợp nhất, rebases hoặc cherrypicks liên quan đến một sự thay đổi để một tập tin nhị phân sẽ liên quan đến bạn làm cho một giải quyết xung đột bằng tay trên tập tin nhị phân đó.

Bạn cần quyết định xem các thay đổi tệp nhị phân có đủ hiếm để bạn có thể sống với công việc thủ công bổ sung mà chúng gây ra trong luồng công việc git thông thường liên quan đến việc hợp nhất, rebases, cherrypicks.

+14

Tôi phải chỉ ra rằng các thay đổi tập tin nhị phân không phải là một vấn đề, làm thay đổi ở nhiều nơi và sau đó cố gắng hợp nhất chúng. –

+10

git có thể tạo ra các khác biệt có ý nghĩa. Một diff được tạo bằng 'git diff --binary' sẽ có thể vá các tập tin nhị phân. –

34

Ngoài các câu trả lời khác.

  • Bạn có thể gửi một diff để tập tin nhị phân sử dụng cái gọi là định dạng nhị phân diff. Nó không thể đọc được, và nó chỉ có thể được áp dụng nếu bạn có chính xác ảnh trong kho lưu trữ của bạn, nghĩa là không có bất kỳ lỗi nào.
    Một ví dụ:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png 
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100 
    GIT binary patch 
    delta 85 
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT 
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)[email protected]{1-oD!M<s|Fj6 
    
    delta 135 
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7; 
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`[email protected] 
    [email protected]=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX 
    
  • Bạn có thể sử dụng textconvgitattributegit diff chương trình diff con người có thể đọc được các file nhị phân, hoặc các bộ phận của tập tin nhị phân. Ví dụ cho các tập tin * .jpg nó có thể khác biệt trong thông tin EXIF, đối với các tập tin PDF, nó có thể khác nhau giữa cách trình bày văn bản của chúng (pdf2text hoặc một cái gì đó tương tự).

HTH.

+3

Cảm ơn rất nhiều vì đã dạy tôi về gitattributes! Mở ra một thế giới hoàn toàn mới về khả năng. – hermannloose

11

Nếu bạn có tệp nhị phân thực sự lớn, bạn có thể sử dụng git-annex để lưu trữ dữ liệu bên ngoài kho lưu trữ. Kiểm tra: http://git-annex.branchable.com/

+2

Git-annex khá tuyệt vời, nhưng có lẽ phù hợp hơn với các tệp * không thay đổi thường xuyên *, ví dụ: một bộ sưu tập các tệp nhạc, hình ảnh, tệp PDF, ... –

+0

Như anh chàng đó đã nói: Git-annex thật tuyệt vời! – dotancohen

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