Как я могу различить бинарные файлы в git?

28

Для того, чтобы различать двоичные файлы в git, я предполагаю, что мне нужно настроить difftool.

Какие difftools работают? Как вы вводите параметры?

Ник Реталлак
источник
Какой вывод вы ожидаете получить из инструмента сравнения двоичного файла? Что это за бинарный файл? Это что-то, что можно отобразить в текстовом формате и затем сравнить?
Зоредаче

Ответы:

22

Вы можете установить textconvопцию конфигурации для типа файла. Смотрите раздел «Выполнение текстовых различий двоичных файлов» в gitattributes (5) . Что вы должны использовать, зависит от типа файла.

Пример 1 :

Скажем, вы хотите различить содержимое zip-файлов. В этом случае вы должны поместить следующее в файл $ GIT_DIR / config или $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

В следующий раз, когда вы запросите diff для zip-файла в репо, он вызовет unzip -vобе версии и передаст полученный текст.

Пример 2 :

Для PDF-файлов вы можете использовать, например pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Пример 3 :

Если для типа файла нет специальной утилиты информации, вы можете, например, использовать hexdump(поставляется с FreeBSD и OSX, также доступны в Linux):

[diff "bin"]
    textconv = hexdump -v -C
Ролан Смит
источник
Я мог бы изменить это в шестнадцатеричном виде. Я был бы достаточно счастлив, просто зная, сколько байтов отличается, или в каких позициях байты различаются. В итоге я использовал Hex Fiend, клонировав свой git-репозиторий, чтобы я мог проверить обе версии файла, потому что я не мог понять, как получить git для запуска программы.
Ник Реталлак
@NickRetallack: см. Добавленные примеры.
Роланд Смит
2
Я добавил Пример 3 в мой git config, но когда я делаю «git diff», он все равно просто выдает мне то же короткое сообщение: «Двоичные файлы a / file и b / file отличаются»
Ник Retallack
1
Если вы хотите использовать libmagic, вам придется заглянуть в исходный код git, чтобы убедиться, что это работает ...
Роланд Смит
5
Я наконец-то заставил это работать, после добавления * .bin diff = bin к моим .gitattributes
Джастин Роу
11

Ответ Ролана Смита был полезным, но в настоящее время он неполный (см. Комментарии) - здесь есть две части.

Вы можете определить новые команды diff в .git/configфайле вашего репозитория или в вашем личном глобальном ~/.gitconfigфайле, например, команду hex diff, используя hexdump:

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

Далее вам нужно использовать .gitattributesфайл репозитория, чтобы сообщить git, какие файлы следует использовать с этой специальной командой diff:

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

Как и .gitignoreфайл, .gitattributesфайл должен быть проверен в вашем хранилище.

В моем случае у меня есть несколько различных расширений файлов, которые я хочу рассматривать как двоичные (например, избегать любых преобразований с окончанием строки при использовании git в Windows), а также вижу любые различия через hexdump:

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

См. Также https://github.com/resin-io/etcher/pull/1367 для другого примера определения команды hexdump diff для использования с файлами изображений.

peterjc
источник
Вы также можете установить .gitattributesглобально (чтобы идти вместе с [diff]записями в вашем глобальном .gitconfig). Если вы сделаете .gitattributesлокальный репо, то пользователю придется изменить его .gitconfigнастройки локального репо, потому что по соображениям безопасности они не будут перенесены на удаленный. В любом случае, каждый пользователь должен как-то обновить свои локальные файлы / конфигурацию, чтобы включить это поведение. В .gitconfigпод [core]add attributesfile = c:/users/<username>/.gitattributesили где вы хотите сохранить его, если вы делаете его глобальным (обратите внимание на прямую черту, даже в Windows).
LightCC
10

Если вы хотите, чтобы git отображал diff для двоичных файлов в виде простого параметра diff, используйте следующую команду --text:

git diff --text
chestozo
источник
-1

Вышеприведенное является исчерпывающим способом сделать это ... однако, если вам просто нужно сделать это для нескольких файлов, я использую следующий метод:

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

Здесь я использую, vimdiffно вы можете использовать любой другой инструмент. Выше можно также объединить в небольшой скрипт, если вам нужно делать это снова и снова.

alpha_989
источник
Похоже, это отменило изменения в моем файле (и создало пустой файл, в котором я хотел, чтобы зафиксированная версия была).
Erhannis