Як я можу відрізняти двійкові файли в git?


28

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

Які дифтоолі працюють? Як ви ставите параметри?


Який вихід ви очікуєте отримати від різного інструменту двійкового файлу? Що це за двійковий файл? Це щось, що можна відтворити у текстовий формат і потім порівняти?
Зоредаче

Відповіді:


22

Ви можете встановити textconvопцію конфігурації для файлового типу. Див. "Виконання текстових відмінностей бінарних файлів" у gitattributes (5) . Що вам слід використовувати, залежить від типу файлу.

Приклад 1 :

Скажімо, ви хочете відрізняти вміст zip-файлів. У цьому випадку слід вказати наступне у файлі $ GIT_DIR / config або $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

Наступного разу, коли ви запитаєте різницю на 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 відрізняються"
Nick Retallack

1
Якщо ви хочете скористатися libmagic, вам доведеться вивчити вихідний код git, щоб побачити, чи це працює ...
Roland Smith

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]Додати" attributesfile = c:/users/<username>/.gitattributesабо де б ви не хотіли зберігати його, якщо ви зробите його глобальним (зверніть увагу на форварші, навіть у windows).
LightCC

10

Якщо ви хочете змусити git показувати, що двійкові файли розрізняються як звичайний текст, використовуйте такий --textваріант, як:

git diff --text

-1

Наведене вище є вичерпними способами зробити це. Однак, якщо вам просто потрібно зробити це для кількох файлів, я використовую наступний метод:

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

Тут я використовую, vimdiffале ви можете використовувати будь-який інший інструмент. Вищезазначене також можна об'єднати в невеликий сценарій, якщо вам потрібно робити це знову і знову.


Здається, я відхилив зміни у моєму файлі (і створив порожній файл там, де я хотів виконати версію).
Ерханніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.