Могу ли я заставить git распознать файл UTF-16 как текст?



я отслеживаю файл виртуальной машины Virtual PC (*.vmc) в git, и после внесения изменений git определил файл как двоичный и не будет различать его для меня. Я обнаружил, что файл закодирован в UTF-16.



можно ли научить git распознавать, что этот файл является текстом и обрабатывать его соответствующим образом?



Я использую git под Cygwin, с ядром.autocrlf установлен в false. Я мог бы использовать mSysGit или git под UNIX, если это необходимо.

713   7  

7 ответов:

я боролся с этой проблемой в течение некоторого времени, и только что обнаружил (для меня) идеальное решение:

$ git config --global diff.tool vimdiff      # or merge.tool to get merging too!
$ git difftool commit1 commit2

git difftool принимает те же аргументы, что и git diff будет, но запускает программу diff по вашему выбору вместо встроенного GNU diff. Поэтому выберите многобайтовый diff (в моем случае, vim в режиме diff) и просто использовать git difftool вместо git diff.

найти "difftool" слишком долго печатать? Нет проблем:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

Git rocks.

есть очень простое решение, которое работает из коробки на Юниксах.

например, с Apple .strings файлы просто:

  1. создать .gitattributes файл в корне вашего репозитория с:

    *.strings diff=localizablestrings
    
  2. добавить следующий код ~/.gitconfig file:

    [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).

но, глядя на .gitattributes manpage, вот пользовательский атрибут, который является binary:

[attr]binary -diff -crlf

так что мне кажется, что вы могли бы определить обычай атрибут в вашем верхнем уровне .gitattributes на utf16 (обратите внимание, что я добавляю merge здесь, чтобы убедиться, что он рассматривается как текст):

[attr]utf16 diff merge -crlf

оттуда вы сможете указать в любом .gitattributes файл:

*.vmc utf16

Также обратите внимание, что вы должны быть в состоянии diff файл, даже если git думает, что это двоичный код:

git diff --text

Edit

ответ в основном говорит, что 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". УМК по type builtin выполнит преобразование, и поэтому вы можете использовать это с помощью способности textconv git diff для включения текстового дифференцирования файлов UTF-16 (также должен работать с UTF-8, хотя и не тестировался).

цитата из gitattributes man page:


выполнение текстовых различий двоичных файлов

иногда желательно увидеть разницу между текстовой версией некоторых двоичных файлов. Например, текстовый процессор документ может быть преобразован в текстовое представление ASCII, и разница текста показано. Даже при том, что это преобразование теряет некоторую информацию, полученное различие полезно для человеческого просмотра (но не может быть применено непосредственно).

параметр конфигурации textconv используется для определения программы для выполнения такого преобразования. Программа должна принять один аргумент, имя файла для преобразования, и произвести результирующий текст на stdout.

например, чтобы показать разницу информации exif файла вместо двоичной информации (при условии, что у вас установлен инструмент exif), добавьте следующий раздел в свой (или $HOME/.gitconfig file):

[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 (the to-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

    Ничего не найдено.