Git говорит: "Двоичные файлы a... и b... отличаются" для *.reg файлов

Есть ли способ заставить Git обрабатывать файлы .reg как текст? Я использую Git для отслеживания моих настроек реестра Windows, и Windows использует .reg для этих файлов.

ОБНОВЛЕНИЕ 1: Я получил его для запуска diff (спасибо, Andrew). Однако теперь это выглядит так. Это проблема с кодировкой?

index 0080fe3..fc51807 100644
--- a/Install On Rebuild/4. Registry Tweaks.reg
+++ b/Install On Rebuild/4. Registry Tweaks.reg
@@ -1,49 +1,48 @@
-<FF><FE>W^@i^@n^@d^@o^@w^@s^@ ^@R^@e^@g^@i^@s^@t^@r^@y^@ ^@E^@d^@i^@t^@o^@r^@
-^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;
-^@^M^@
...

Любые идеи?

ОБНОВЛЕНИЕ 2: Спасибо всем, кто помог: вот что я сделал в конце: создайте файл .gitattributes с контентом *.reg text diff, а затем я преобразовал файлы в UTF-8 как UTF-16 странно с различиями. Я не использую иностранных символов, поэтому UTF-8 работает для меня.

Ответ 1

Чтобы сообщить git явно разбить тип файла, поместите следующее в файл .gitattributes в корневой каталог репозитория:

*.reg diff

Ответ 2

Git обрабатывает ваши файлы экспорта реестра как двоичные файлы, поскольку они имеют NUL. Нет никакого хорошего способа разграничения или объединения общих двоичных файлов. Изменение одного байта может изменить интерпретацию остальной части файла.

Существует два общих подхода к обработке двоичных файлов:

  • Примите, что они двоичные. Различия не будут иметь смысла, поэтому не просите их. Никогда не объединяйте их, а это означает, что вы можете изменять только одну ветвь. В этом случае это можно упростить, поместив каждую настройку (или набор связанных настроек в отдельный файл, чтобы было меньше возможных различий в одном файле.

  • Сохраните изменения в виде текста и конвертируйте/деконвертируйте в эти двоичные формы.

Несмотря на то, что эти "текстовые" файлы, кодировка UTF-16 содержит NUL. Однако, похоже, нет не-ASCII-битов. Можете ли вы преобразовать их в ASCII (или UTF-8, который будет ASCII, если нет расширенных символов)?

Ответ 3

Преобразуйте файлы .reg с utf16 в utf8, открыв каждый .reg файл в блокноте и сохраняя в качестве кодировки UTF-8.

Ответ 4

Создайте utf16toascii.py:

#!/usr/bin/env python3
import sys
data = open(sys.argv[-1]).read()
ascii = data.decode('utf-16').encode('ascii', 'replace')
sys.stdout.write(ascii)

Затем в bash выполните:

$ echo "*.reg diff=utf16strings" >> .gitattributes
$ git config --global diff.utf16strings.textconv /path/to/utf16toascii.py

И вы можете различать файлы реестра, а также файлы Xcode.strings или любой другой файл utf-16.