Làm thế nào tôi có thể khác biệt tập tin nhị phân trong git?


22

Tôi giả sử tôi cần phải thiết lập một Difftool. Những gì khác nhau làm việc? Làm thế nào để bạn đặt các tham số trong?


Loại đầu ra nào bạn mong đợi nhận được từ một công cụ tìm khác biệt của tệp nhị phân? Đây là loại tệp nhị phân nào? Nó có phải là một cái gì đó có thể được kết xuất thành một định dạng văn bản và sau đó so sánh?
Zoredache

Câu trả lời:


19

Bạn có thể đặt một textconv tùy chọn cấu hình cho một filetype. Xem "Thực hiện khác biệt văn bản của tệp nhị phân" trong gitattribut (5) . Những gì bạn nên sử dụng phụ thuộc vào filetype.

ví dụ 1 :

Giả sử bạn muốn tìm khác biệt nội dung của tệp zip. Trong trường hợp đó, bạn nên đặt phần sau vào tệp $ GIT_DIR / config hoặc $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

Lần tới khi bạn yêu cầu tìm khác biệt trên tệp zip trong repo, nó sẽ gọi unzip -v trên cả hai phiên bản và diff văn bản kết quả.

Ví dụ 2 :

Đối với các tệp pdf, bạn có thể sử dụng, ví dụ: pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Ví dụ 3 :

Nếu không có tiện ích thông tin cụ thể nào cho kiểu tệp, bạn có thể ví dụ: sử dụng hexdump (đi kèm với FreeBSD và OSX, cũng có sẵn trên Linux):

[diff "bin"]
    textconv = hexdump -v -C

Tôi có thể khác nó trong hex. Tôi rất vui khi biết có bao nhiêu byte khác nhau, hoặc tại các vị trí của các byte khác nhau. Tôi đã kết thúc việc sử dụng Hex Fiend bằng cách sao chép kho git của mình để tôi có thể kiểm tra cả hai phiên bản của tệp, vì tôi không thể tìm ra cách để git khởi chạy chương trình.
Nick Retallack

@NickRetallack: xem thêm ví dụ.
Roland Smith

2
Tôi đã thêm ví dụ 3 vào cấu hình git của mình, nhưng khi tôi thực hiện "git diff", nó vẫn chỉ cho tôi một thông báo ngắn: "Tệp nhị phân a / file và b / file khác nhau"
Nick Retallack

1
Nếu bạn muốn sử dụng libmagic, bạn sẽ phải xem mã nguồn git để xem nó có hoạt động không ...
Roland Smith

5
Cuối cùng tôi cũng đã làm việc này, sau khi thêm * .bin diff = bin vào .gitattribut của tôi
Justin Rowe

7

Câu trả lời từ Roland Smith rất hữu ích nhưng hiện chưa đầy đủ (xem các bình luận) - có hai phần cho vấn đề này.

Bạn có thể định nghĩa một lệnh diff mới trong kho của bạn .git/config tập tin hoặc toàn cầu cá nhân của bạn ~/.gitconfig tập tin, ví dụ một lệnh hex diff sử dụng hexdump:

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

Tiếp theo, bạn cần sử dụng kho lưu trữ .gitattributes tập tin để nói với git tập tin nào nên được sử dụng với lệnh diff đặc biệt này:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

Giống như .gitignore tập tin .gitattributes tập tin nên được kiểm tra vào kho lưu trữ của bạn.

Trong trường hợp của tôi, tôi có một số phần mở rộng tệp khác nhau mà tôi muốn coi là nhị phân (ví dụ: tránh mọi chuyển đổi kết thúc dòng nếu sử dụng git trên Windows) và cũng thấy bất kỳ sự khác biệt nào thông qua hexdump:

https://github.com/peterjc/galax_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

Xem thêm https://github.com/resin-io/etcher/pull/1367 cho một ví dụ khác xác định lệnh diff hexdump để sử dụng với các tệp hình ảnh.


-1

Trên đây là những cách toàn diện để làm như vậy .. tuy nhiên, nếu bạn chỉ cần làm điều đó cho một vài tệp, phương pháp sau đây là cách tôi sử dụng:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

Ở đây tôi đang sử dụng vimdiff nhưng bạn có thể sử dụng bất kỳ công cụ nào khác. Ở trên cũng có thể được kết hợp thành một kịch bản nhỏ nếu bạn cần làm đi làm lại nhiều lần.


Điều này dường như đã loại bỏ các thay đổi đối với tệp của tôi (và tạo một tệp trống nơi tôi muốn phiên bản đã cam kết).
Erhannis
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.