Я отслеживаю файл виртуальной машины Virtual PC (* .vmc) в git, и после внесения изменений git определил файл как двоичный и не стал бы различать его для меня. Я обнаружил, что файл был закодирован в UTF-16.
Можно ли научить git распознавать, что это текстовый файл, и обрабатывать его соответствующим образом?
Я использую git под Cygwin, для core.autocrlf установлено значение false. При необходимости я мог бы использовать mSysGit или git под UNIX.
Существует очень простое решение, которое "из коробки" работает в Unices.
Например, с
.strings
файлами Apple просто:Создайте
.gitattributes
файл в корне вашего репозитория с помощью:Добавьте в свой
~/.gitconfig
файл следующее:Источник: файлы Diff .strings в Git (и более ранняя публикация 2010 г.).
источник
iconv
это «еще один инструмент», точно так же, как Vim или Beyond Compare (не входит в набор git).vimdiff
иiconv
оба они уже присутствуют в macOS, поэтому вам не нужно беспокоиться о том, где их взять, и ониВы пытались настроить его так,
.gitattributes
чтобы он воспринимался как текстовый файл?например:
Подробнее см. Http://www.git-scm.com/docs/gitattributes.html .
источник
set
иdiff
...*.vmc diff
и*.sql diff
т. Д. Необходимо установить атрибут 'diff' для указанного пути. (Не могу редактировать ответ). Однако есть два предостережения: различия отображаются с пробелом между каждым символом, и невозможно «сгруппировать фрагмент» или «отбросить фрагмент» для этих проблемных файлов.По умолчанию похоже, что
git
с UTF-16 работать не будет; для такого файла вы должны убедиться , что сделать неCRLF
обработка не выполняется на нем, но вы хотите ,diff
иmerge
работать как обычный текстовый файл (это игнорирует , может ли ваш терминал / редактор обрабатывать UTF-16).Но, глядя на
.gitattributes
страницу руководства, можно увидеть настраиваемый атрибутbinary
:Мне кажется, что вы можете определить настраиваемый атрибут на своем верхнем уровне
.gitattributes
дляutf16
(обратите внимание, что я добавляю слияние здесь, чтобы убедиться, что он обрабатывается как текст):Оттуда вы можете указать в любом
.gitattributes
файле что-то вроде:Также обратите внимание, что вы все равно должны иметь
diff
доступ к файлу, даже еслиgit
считаете его двоичным:редактировать
Этот ответ в основном говорит о том, что GNU diff с UTF-16 или даже UTF-8 работает не очень хорошо. Если вы хотите
git
использовать другой инструмент, чтобы увидеть различия (через--ext-diff
), этот ответ предлагает Гиффи .Но вам, вероятно, понадобится только
diff
файл UTF-16, содержащий только символы ASCII. Чтобы заставить это работать, используйте--ext-diff
следующий сценарий оболочки:Обратите внимание, что преобразование в UTF-8 может работать и для слияния, вам просто нужно убедиться, что это сделано в обоих направлениях.
Что касается вывода на терминал при просмотре diff файла UTF-16:
GNU diff на самом деле не заботится о юникоде, поэтому, когда вы используете diff --text, он просто сравнивает и выводит текст. Проблема в том, что используемый вами терминал не может обрабатывать передаваемый UTF-16 (в сочетании с разностными метками, которые являются символами ASCII).
источник
Решение - отфильтровать
cmd.exe /c "type %1"
. Встроеннаяtype
команда cmd выполнит преобразование, поэтому вы можете использовать это с возможностью textconv git diff, чтобы включить текстовое различие файлов UTF-16 (также должно работать с UTF-8, хотя и не тестировалось).Цитата из справочной страницы gitattributes:
Выполнение текстовых различий бинарных файлов
Иногда желательно увидеть разницу между текстовыми версиями некоторых двоичных файлов. Например, документ текстового процессора можно преобразовать в текстовое представление ASCII и показать различие текста. Несмотря на то, что это преобразование теряет некоторую информацию, полученное различие полезно для просмотра человеком (но не может применяться напрямую).
Параметр конфигурации textconv используется для определения программы для выполнения такого преобразования. Программа должна принимать единственный аргумент, имя файла, который нужно преобразовать, и выдавать результирующий текст на стандартный вывод.
Например, чтобы показать различие информации exif файла вместо двоичной информации (при условии, что у вас установлен инструмент exif), добавьте следующий раздел в свой
$GIT_DIR/config
файл (или$HOME/.gitconfig
файл):Решение для mingw32 , поклонникам cygwin, возможно, придется изменить подход. Проблема заключается в передаче имени файла для преобразования в cmd.exe - он будет использовать косую черту, а cmd предполагает разделители каталогов обратной косой чертой.
Шаг 1:
Создайте сценарий с одним аргументом, который будет преобразовывать в стандартный вывод. c: \ путь \ к \ some \ script.sh:
Шаг 2:
Настройте git, чтобы иметь возможность использовать файл сценария. Внутри вашей конфигурации git (
~/.gitconfig
или.git/config
или посмотритеman git-config
) поместите это:Шаг 3:
Укажите файлы, к которым следует применить этот обходной путь, используя файлы .gitattributes (см. Man gitattributes (5)):
затем используйте
git diff
в своих файлах.источник
cmd //c type "${1//\//\\}"
.textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
git недавно начал понимать кодировки, такие как utf16. См. Документацию gitattributes , найдите
working-tree-encoding
[Убедитесь, что ваша справочная страница совпадает, так как она совсем новая!]
Если (скажем) файл UTF-16 без спецификации на машине Windows, добавьте в свой
.gitattributes
файлЕсли UTF-16 (с bom) на * nix сделает это:
(Заменить
*.vmc
на*.whatever
дляwhatever
файлов типа вам нужно ручкой)См .: Поддержка кодировки рабочего дерева "UTF-16LE-BOM" .
Добавлено позже
После @Hackslash можно обнаружить, что этого недостаточно
Чтобы получить красивые текстовые различия, вам нужно
Помещение обоих тоже работает
Но это возможно
eol=...
подразумеваетtext
Проблема
В Git есть макро-атрибут,
binary
который означает-text -diff
. Противоположный+text +diff
не доступна встроенной, но git дает инструменты (я думаю!) Для его синтеза.Решение
Git позволяет определять новые атрибуты макроса.
Я бы предложил эту верхнюю часть
.gitattributes
файла, который у вас естьЗатем для всех путей, которые должны быть text и diff, выполните
Обратите внимание, что в большинстве случаев нам нужна кодировка по умолчанию (utf-8) и eol по умолчанию (native), поэтому их можно отбросить.
Большинство строк должно выглядеть так
Почему бы просто не использовать diff?
Практично: в большинстве случаев нам нужен собственный eol. Что значит нет
eol=...
. Этоtext
не подразумевается, и его нужно указывать явно.Концептуальный: текст против двоичного - фундаментальное различие. eol, encoding, diff и т. д. - это лишь некоторые его аспекты.
Отказ от ответственности
Из-за странных времен, в которых мы живем, у меня нет машины с текущим работающим git. Поэтому в настоящий момент я не могу проверить последнее добавление. Если кто что-то не так, поправлю / удалю.
источник
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
одиночестве у вас не было хороших текстовых различий? Не могли бы вы проверить это с обоими,text
иdiff
все работает нормально? В таком случае я дам другую рекомендациюtext
только правильное приводит к двоичному сравнению. Я могу это сделать,diff
илиtext diff
это работает. Мне нужно было добавить-BOM
просто потому, что у моего файла была спецификация YMMV.Я написал небольшой драйвер git-diff
to-utf8
, который должен упростить сравнение любых файлов в кодировке, отличной от ASCII / UTF-8. Вы можете установить его, следуя инструкциям здесь: https://github.com/chaitanyagupta/gitutils#to-utf8 (to-utf8
скрипт доступен в том же репо).Обратите внимание, что для этого сценария в системе должны быть доступны обе команды
file
иiconv
.источник
Если бы эта проблема на Windows , в последнее время , а
dos2unix
иunix2dos
бункера , которые поставляются с мерзавцем для окон сделали трюк. По умолчанию они расположены вC:\Program Files\Git\usr\bin\
. Обратите внимание, это будет работать, только если ваш файл не должен быть в формате UTF-16. Например, кто-то случайно закодировал файл python как UTF-16, когда в этом не было необходимости (в моем случае).а также
источник