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):
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:
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:
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:
Odpowiedzi:
Możesz ustawić
textconv
opcję 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.
Następnym razem, gdy poprosisz o plik różnic w pliku zip w repozytorium, wywoła
unzip -v
on obie wersje i różnicuje wynikowy tekst.Przykład 2 :
W przypadku plików PDF można użyć np
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):źródło
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/config
pliku repozytorium lub osobistym~/.gitconfig
pliku globalnym , na przykład polecenie hex diff, używająchexdump
:Następnie musisz użyć
.gitattributes
pliku repozytorium, aby powiedzieć git, które pliki powinny zostać użyte w tym specjalnym poleceniu diff:Podobnie jak w przypadku
.gitignore
pliku,.gitattributes
plik 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.
źródło
.gitattributes
globalnie (aby uzupełnić[diff]
wpisy w swoim globalnym.gitconfig
). Jeśli.gitattributes
utworzysz plik lokalny dla repozytorium, użytkownik będzie musiał zmodyfikować.gitconfig
ustawienia 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.gitconfig
pod[core]
dodatkuattributesfile = c:/users/<username>/.gitattributes
lub gdziekolwiek chcesz zapisać go, jeśli sprawiają, że globalny (zwróć uwagę na forwardslashes, nawet w oknach).Jeśli chcesz zmusić git do pokazania różnic plików binarnych jako zwykłego tekstu, użyj
--text
opcji:źródło
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:
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.źródło