Могу ли я заставить git распознать файл UTF-16 как текст?
я отслеживаю файл виртуальной машины Virtual PC (*.vmc) в git, и после внесения изменений git определил файл как двоичный и не будет различать его для меня. Я обнаружил, что файл закодирован в UTF-16.
можно ли научить git распознавать, что этот файл является текстом и обрабатывать его соответствующим образом?
Я использую git под Cygwin, с ядром.autocrlf установлен в false. Я мог бы использовать mSysGit или git под UNIX, если это необходимо.
7 ответов:
я боролся с этой проблемой в течение некоторого времени, и только что обнаружил (для меня) идеальное решение:
$ git config --global diff.tool vimdiff # or merge.tool to get merging too! $ git difftool commit1 commit2
git difftoolпринимает те же аргументы, что иgit diffбудет, но запускает программу diff по вашему выбору вместо встроенного GNUdiff. Поэтому выберите многобайтовый diff (в моем случае,vimв режиме diff) и просто использоватьgit difftoolвместоgit diff.найти "difftool" слишком долго печатать? Нет проблем:
$ git config --global alias.dt difftool $ git dt commit1 commit2Git rocks.
есть очень простое решение, которое работает из коробки на Юниксах.
например, с Apple
.stringsфайлы просто:
создать
.gitattributesфайл в корне вашего репозитория с:*.strings diff=localizablestringsдобавить следующий код
~/.gitconfigfile:[diff "localizablestrings"] textconv = "iconv -f utf-16 -t utf-8"источник: Diff .строки файлов в Git (и старый пост С 2010 года).
вы пробовали установить свой
.gitattributesрассматривать его как текстовый файл?например:
*.vmc diffподробнее на http://www.git-scm.com/docs/gitattributes.html.
по умолчанию он выглядит так:
gitне будет хорошо работать с UTF-16; для такого файла вы должны убедиться, что нетCRLFобработка делается на нем, но вы хотитеdiffиmergeдля работы в качестве обычного текстового файла (это игнорирует, может ли ваш терминал/редактор обрабатывать UTF-16).но, глядя на
.gitattributesmanpage, вот пользовательский атрибут, который являетсяbinary:[attr]binary -diff -crlfтак что мне кажется, что вы могли бы определить обычай атрибут в вашем верхнем уровне
.gitattributesнаutf16(обратите внимание, что я добавляю merge здесь, чтобы убедиться, что он рассматривается как текст):[attr]utf16 diff merge -crlfоттуда вы сможете указать в любом
.gitattributesфайл:*.vmc utf16Также обратите внимание, что вы должны быть в состоянии
diffфайл, даже еслиgitдумает, что это двоичный код:git diff --textEdit
ответ в основном говорит, что GNU diff wth UTF-16 или даже UTF-8 работает не очень хорошо. Если вы хотите иметь
gitиспользовать другой инструмент, чтобы увидеть различия (через--ext-diff), что ответ напрашивается Guiffy.но то, что вы, вероятно, нужно это просто
diffфайл UTF-16, содержащий только символы ASCII. Способ заставить это работать-использовать--ext-diffи следующий скрипт:#!/bin/bash diff <(iconv -f utf-16 -t utf-8 "") <(iconv -f utf-16 -t utf-8 "")обратите внимание, что преобразование в UTF-8 может работать и для слияния, вам просто нужно убедиться, что это сделано в обоих направлениях.
что касается вывода на терминал при просмотре diff файла UTF-16:
попытка diff, как это приводит к двоичный мусор выплюнул на экран. Если git использует GNU diff, это будет кажется, что GNU diff нет Юникод.
GNU diff на самом деле не заботится о unicode, поэтому, когда вы используете diff --text, он просто отличается и выводит текст. Проблема в том, что терминал, который вы используете, не может обработайте UTF-16, который испускается (в сочетании с метками diff, которые являются символами ASCII).
решение состоит в том, чтобы фильтровать через
cmd.exe /c "type %1". УМК поtypebuiltin выполнит преобразование, и поэтому вы можете использовать это с помощью способности textconv git diff для включения текстового дифференцирования файлов UTF-16 (также должен работать с UTF-8, хотя и не тестировался).цитата из gitattributes man page:
выполнение текстовых различий двоичных файлов
иногда желательно увидеть разницу между текстовой версией некоторых двоичных файлов. Например, текстовый процессор документ может быть преобразован в текстовое представление ASCII, и разница текста показано. Даже при том, что это преобразование теряет некоторую информацию, полученное различие полезно для человеческого просмотра (но не может быть применено непосредственно).
параметр конфигурации textconv используется для определения программы для выполнения такого преобразования. Программа должна принять один аргумент, имя файла для преобразования, и произвести результирующий текст на stdout.
например, чтобы показать разницу информации exif файла вместо двоичной информации (при условии, что у вас установлен инструмент exif), добавьте следующий раздел в свой (или
$HOME/.gitconfigfile):[diff "jpg"] textconv = exif
решение для mingw32, поклонникам cygwin, возможно, придется изменить подход. Проблема заключается в передаче имени файла для преобразования в cmd.exe-он будет использовать прямые косые черты, а cmd предполагает разделители каталогов с обратной косой чертой.
шаг 1:
создайте сценарий с одним аргументом, который будет выполнять преобразование в stdout. c:\path\to\some\script.sh:
#!/bin/bash SED='s/\//\\\\/g' FILE=\`echo | sed -e "$SED"\` cmd.exe /c "type $FILE"Шаг 2:
настройка git, чтобы иметь возможность использовать файл сценария. Внутри вашего git config (
~/.gitconfigили.git/configилиman git-config), поставить этот:[diff "cmdtype"] textconv = c:/path/to/some/script.shШаг 3:
укажите файлы для применения этого workarond с помощью использования .файлы gitattributes (см. man gitattributes(5)):
*vmc diff=cmdtypeзатем использовать
git diffв ваших файлах.
Я написал небольшой драйвер git-diff,
to-utf8, Что должно облегчить различение любых не-ASCII/UTF-8 закодированных файлов. Вы можете установить его, используя инструкции здесь:https://github.com/chaitanyagupta/gitutils#to-utf8 (theto-utf8скрипт находится в том же РЕПО).обратите внимание, что этот сценарий требует как
fileиiconvкоманды будут доступны в системе.
была эта проблема на Windows в последнее время, и
dos2unixиunix2dosбункеры, которые корабль с git для windows сделал трюк. По умолчанию они расположены вC:\Program Files\Git\usr\bin\. обратите внимание, что это будет работать только если ваш файл не должен быть UTF-16. например, кто-то случайно закодировал файл python как UTF-16, когда это не нужно было (в моем случае).PS C:\Users\xxx> dos2unix my_file.py dos2unix: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 Unix format...и
PS C:\Users\xxx> unix2dos my_file.py unix2dos: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 DOS format...
Comments