Как я могу различить бинарные файлы в 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 для использования с файлами изображений.


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

10

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

git diff --text

-1

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

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

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


Похоже, это отменило изменения в моем файле (и создало пустой файл, в котором я хотел, чтобы зафиксированная версия была).
Erhannis
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.