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


96

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 đang được sửa đổi và nhiều tệp nén chưa bao giờ (hoặc gần như không bao giờ) được sửa đổi, liệu git có xử lý tốt không? Ví dụ: nếu tôi chèn hoặc loại bỏ phần giữa và chèn dữ liệu vào gần phần cuối, nó sẽ nhận thấy nó như với văn bản?

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


1
rất tốt với nhị phân - i sử dụng nó bản thân mình
tekknolagi

Đó là sự thật. Bạn có thể đặt / home của mình dưới bản sửa đổi git và nó sẽ hoạt động khá tốt.
Loïc Faure-Lacroix

1
Đây không phải là tinh thần của câu hỏi, đã được lưu ý rõ ràng là lo ngại về việc liệu các tệp nhị phân có thực hiện khác biệt trên chúng hay không (có thể vì lý do mở rộng kho lưu trữ và lý do hiệu suất). Tuy nhiên, tôi đã không phản đối nó (và có vẻ như bất cứ ai đã làm đã loại bỏ nó).
coreyward

1
Lưu ý: bây giờ bạn có git-lts, để lưu trữ các tệp nhị phân của bạn ở nơi khác: stackoverflow.com/a/29530784/6309
VonC

1
Nó có làm phồng thư mục .git không?
Nikhil

Câu trả lời:


47

Ngoài ra, git có thể dễ dàng thêm các tệp nhị phân vào chỉ mục của nó và cũng 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 lớn không thể nén.

Các vấn đề bắt đầu khi git cần tạo khác biệt và hợp nhất: git không thể tạo 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, giảm giá hoặc cherrypicks liên quan đến thay đổi đối với tệp nhị phân sẽ liên quan đến việc bạn thực hiện giải quyết xung đột thủ công trên tệp 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 quy trình làm việc git bình thường liên quan đến hợp nhất, giảm giá, cherrypicks hay không.


25
Tôi phải chỉ ra rằng thay đổi tệp nhị phân không phải là vấn đề, thực hiện thay đổi ở nhiều nơi và sau đó cố gắng hợp nhất chúng.
Winston Ewert

15
git có thể tạo ra các khác biệt có ý nghĩa. Một khác biệt được tạo bằng git diff --binarysẽ có thể vá các tệp nhị phân.
CB Bailey

46

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

  • Bạn có thể gửi một khác biệt sang tệp nhị phân bằng cách sử dụng định dạng khác biệt nhị phân . Nó không thể đọc được bởi con người và nó chỉ có thể được áp dụng nếu bạn có preimage chính xác trong kho lưu trữ của mình, tức là không có bất kỳ lông tơ 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)C@u6{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`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Bạn có thể sử dụng textconv gitattribute để git diffhiển thị sự khác biệt mà con người có thể đọc được cho các tệp nhị phân hoặc các phần của tệp nhị phân. Ví dụ: đối với tệp * .jpg, nó có thể là sự khác biệt về thông tin EXIF, đối với tệp PDF, nó có thể là sự khác biệt giữa biểu diễn văn bản của chúng (pdf2text hoặc một cái gì đó tương tự).

HTH.


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

15

Nếu bạn có cá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/


6
Git-phụ lục là khá tuyệt vời, nhưng có lẽ phù hợp hơn cho các tập tin mà không thay đổi tất cả những gì thường , ví dụ như một bộ sưu tập các tập tin nhạc, hình ảnh, PDF, ...
sr_

@sr_ chính xác, Git LFS cũng vậy. Có vẻ như không có hệ thống kiểm soát phiên bản nào phù hợp với những loại trường hợp sử dụng này trong khi cũng có một hệ thống phân tán làm cơ sở (như Git).
Marc J. Schmidt

5

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 điều đáng chú ý là Git không làm điều này ngay cả đối với các tệp văn bản. Git lưu trữ các tệp dưới dạng các đốm màu và nó có sự khác biệt giữa chúng khi cần thiết.

Nếu bạn đang tìm cách kiểm soát phiên bản trên một cái gì đó 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 thực hiện thao tác khác biệt thông minh.


1
Từ sách cộng đồng git ( book.git-scm.com/7_how_git_stores_objects.html ): "Để tiết kiệm dung lượng đó, Git sử dụng packfile. Đây là đị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, nó tương tự như. "
Wayne Conrad

2
Vâng, đó là nếu / khi bạn chạy git gcđi thu gom rác. Từ cùng một trang: "Vì Git lưu trữ từng phiên bản của mỗi tệp dưới dạng một đối tượng riêng biệt, nó có thể hoạt động 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ữ toàn bộ tệp thứ hai, điều này là một sự lãng phí lớn về không gian. "
coreyward

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

1
Từ trang chủ của git gc: "Người dùng được khuyến khích chạy tác vụ này thường xuyên trong mỗi kho lưu trữ để duy trì khả năng sử dụng không gian đĩa tốt và hiệu suất hoạt động tốt. Một số lệnh git có thể tự động chạy git gc; xem cờ --auto bên dưới để biết chi tiết . "
Jacob Akkerboom

1
@KennyEvitt Hiện có rất nhiều. Tóm tắt là một, và Kactus là một khác sử dụng git đằng sau hậu trường.
coreyward

3

Git cũng tốt với mã 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 hợp nhất các tệp nhị phân. Ý tôi là, một khác biệt trên jpeg sẽ không bao giờ trả lại cho bạn bất cứ thứ gì. Git hoạt động rất tốt với tệp văn bản và có lẽ cũng tệ như mọi giải pháp khác với tệp nhị phân!


2

nếu bạn muốn một giải pháp để lập phiên bản, bạn có thể muốn xem xét git-lfs có một con trỏ nhẹ đến tệp của bạn.

nó có nghĩa là khi bạn sao chép repo của mình, nó sẽ không tải xuống tất cả các phiên bản mà chỉ tải xuống một phiên bản đã được đăng xuất.

Đây là một hướng dẫn hay về cách sử dụng nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.