Jak mogę różnicować pliki binarne w git?

28

Aby różnicować pliki binarne w git, zakładam, że muszę skonfigurować difftool.

Jakie dyftoole działają? Jak umieszczasz parametry?

Nick Retallack
źródło
Jakiego rodzaju wyników oczekujesz od narzędzia różnicowego pliku binarnego? Co to za plik binarny? Czy jest to coś, co można przekształcić do formatu tekstowego, a następnie porównać?
Zoredache

Odpowiedzi:

22

Możesz ustawić textconvopcję konfiguracji dla typu pliku. Zobacz „Wykonywanie różnic tekstowych plików binarnych” w gitattributes (5) . To, czego powinieneś użyć, zależy od rodzaju pliku.

Przykład 1 :

Powiedz, że chcesz różnicować zawartość plików zip. W takim przypadku należy umieścić następujące elementy w pliku $ GIT_DIR / config lub $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

Następnym razem, gdy poprosisz o plik różnic w pliku zip w repozytorium, wywoła unzip -von obie wersje i różnicuje wynikowy tekst.

Przykład 2 :

W przypadku plików PDF można użyć np pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Przykład 3 :

Jeśli nie ma określonego narzędzia informacyjnego dla typu pliku, możesz np. Użyć hexdump(dostarczany z FreeBSD i OSX, dostępny również w systemie Linux):

[diff "bin"]
    textconv = hexdump -v -C
Roland Smith
źródło
Mógłbym to odróżnić szesnastkowo. Byłbym szczęśliwy, wiedząc tylko, ile bajtów jest różnych lub w jakich pozycjach się różnią. Skończyło się na użyciu Hex Fienda poprzez klonowanie mojego repozytorium git, aby móc sprawdzić obie wersje pliku, ponieważ nie mogłem wymyślić, jak uzyskać git, aby uruchomić program.
Nick Retallack
@NickRetallack: patrz dodane przykłady.
Roland Smith
2
Dodałem przykład 3 do mojej konfiguracji git, ale kiedy robię „git diff”, nadal wyświetla mi ten sam krótki komunikat: „Pliki binarne różnią się od pliku / pliku i pliku b /”
Nick Retallack
1
Jeśli chcesz użyć libmagic, musisz zajrzeć do kodu źródłowego git, aby zobaczyć, czy to działa ...
Roland Smith
5
W końcu zacząłem działać, po dodaniu * .bin diff = bin do moich .gitattributes
Justin Rowe
11

Odpowiedź Rolanda Smitha była pomocna, ale obecnie jest niekompletna (patrz komentarze) - są na to dwie części.

Możesz zdefiniować nowe polecenia diff w .git/configpliku repozytorium lub osobistym ~/.gitconfigpliku globalnym , na przykład polecenie hex diff, używając hexdump:

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

Następnie musisz użyć .gitattributespliku repozytorium, aby powiedzieć git, które pliki powinny zostać użyte w tym specjalnym poleceniu diff:

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

Podobnie jak w przypadku .gitignorepliku, .gitattributesplik powinien być sprawdzany w swoim repozytorium.

W moim przypadku mam kilka różnych rozszerzeń plików, które chcę traktować jako pliki binarne (np. Unikaj konwersji kończących linię, jeśli używasz git w systemie Windows), a także widzę różnice poprzez hexdump:

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

Zobacz także https://github.com/resin-io/etcher/pull/1367, gdzie znajduje się inny przykład definiujący polecenie difdump diff do użytku z plikami obrazów.

peterjc
źródło
Możesz także ustawić .gitattributesglobalnie (aby uzupełnić [diff]wpisy w swoim globalnym .gitconfig). Jeśli .gitattributesutworzysz plik lokalny dla repozytorium, użytkownik będzie musiał zmodyfikować .gitconfigustawienia lokalnego repozytorium, ponieważ ze względów bezpieczeństwa nie zostaną one przekazane do pilota. Tak czy inaczej, każdy użytkownik musi jakoś zaktualizować swoje lokalne pliki / konfigurację, aby włączyć to zachowanie. W .gitconfigpod[core] dodatku attributesfile = c:/users/<username>/.gitattributeslub gdziekolwiek chcesz zapisać go, jeśli sprawiają, że globalny (zwróć uwagę na forwardslashes, nawet w oknach).
LightCC
10

Jeśli chcesz zmusić git do pokazania różnic plików binarnych jako zwykłego tekstu, użyj --textopcji:

git diff --text
chestozo
źródło
-1

Powyższe są wszechstronnymi sposobami, aby to zrobić .. jeśli jednak musisz to zrobić tylko dla kilku plików, używam następującej metody:

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

Tutaj używam vimdiff ale możesz użyć dowolnego innego narzędzia. Powyższe można również połączyć w mały skrypt, jeśli musisz to robić w kółko.

alpha_989
źródło
Wygląda na to, że porzucił zmiany w moim pliku (i utworzył pusty plik, w którym chciałem, aby była zatwierdzona wersja).
Erhannis,