По умолчанию похоже, что git
не будет хорошо работать с UTF-16; для такого файла вы должны убедиться, что обработка CRLF
не выполняется, но вы хотите, чтобы diff
и merge
работали как обычный текстовый файл (это игнорирует, может ли ваш терминал / редактор обрабатывать или нет) UTF-16).
Но, глядя на справочную страницу .gitattributes
, вот пользовательский атрибут binary
:
[attr]binary -diff -crlf
Так что мне кажется, что вы можете определить пользовательский атрибут на своем верхнем уровне .gitattributes
для utf16
(обратите внимание, что я добавляю здесь слияние, чтобы убедиться, что он обрабатывается как текст):
[attr]utf16 diff merge -crlf
Оттуда вы сможете указать в любом файле .gitattributes
что-то вроде:
*.vmc utf16
Также обратите внимание, что вы все равно сможете diff
файл, даже если git
считает, что это двоичный файл с:
git diff --text
Редактировать
Этот ответ в основном говорит, что GNU diff с UTF-16 или даже UTF-8 работает не очень хорошо. Если вы хотите, чтобы git
использовал другой инструмент для просмотра различий (через --ext-diff
), этот ответ предполагает Guiffy .
Но вам, скорее всего, нужно просто diff
файл UTF-16, который содержит только символы ASCII. Чтобы заставить это работать, используйте --ext-diff
и следующий скрипт:
#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")
Обратите внимание, что преобразование в UTF-8 может также работать для слияния, вам просто нужно убедиться, что это сделано в обоих направлениях.
Что касается вывода на терминал при просмотре различий файла UTF-16:
Попытка различий таким образом приводит к
бинарный мусор извергается на экран.
Если git использует GNU diff, это
кажется, что GNU diff не
Юникод.
GNU diff на самом деле не заботится о юникоде, поэтому, когда вы используете diff --text, он просто diff и выводит текст. Проблема в том, что используемый вами терминал не может обрабатывать испускаемый UTF-16 (в сочетании с метками diff, которые являются символами ASCII).