2010-10-12 3 views

ответ

4

Я работал на много лучше решения с помощью людей msysGit, и придумали этот чистый/смазыванию фильтр. Фильтр использует команды Gnu file и iconv для определения типа файла и преобразования его в внутренний формат UTF-8 из MSysGit.

Этот тип фильтра очистки/смазывания дает вам гораздо большую гибкость. Это должно позволить Git обрабатывать ваши файлы в смешанном формате как текст UTF-8 в большинстве случаев: diffs, merge, git-grep, а также свойства gitattributes, такие как eol-conversion, ident-replacement и встроенные шаблоны diff.

Решение для фильтра рассеяния, описанное выше, работает только для различий, и поэтому гораздо более ограничено.

Чтобы настроить этот фильтр:

  1. Получить Gnu libiconv и file, и установить оба.
  2. Убедитесь, что бен каталог GnuWin32 \ (обычно "C: \ Program Files \ GnuWin32 \ Bin") находится в папке% PATH%
  3. Добавьте следующие строки в ~ \ Git \ и т.д. \ gitconfig:

    [filter "mixedtext"] 
        clean = iconv -sc -f $(file -b --mime-encoding %f) -t utf-8 
        smudge = iconv -sc -f utf-8 -t $(file -b --mime-encoding %f) 
        required 
    
  4. Добавьте строку к вашему глобальному ~/Git/etc/gitattributes или local ~ /.gitattributes для обработки смешанного форматирования текста, например:

    *.txt filter=mixedtext 
    

Я использовал это на каталог с SQL файлов в ANSI, UTF-16 и UTF-8 форматов. Он работает до сих пор. Запрет на любые сюрпризы, это похоже на 20% усилий, которые могли бы покрыть 80% всех проблем текстового формата Windows.

+0

можете ли вы подтвердить ретроспективное применение этого решения для предыдущих коммитов? Я попробовал это, и мои изменения в файлах UTF-16 все еще не отображаются в инструменте 'gitk' в msysgit. – Adam

+0

кажется, что это сбой, когда я делаю «git pull», который включает файлы, удаленные другим пользователем git. Я получаю сообщение об ошибке msg от iconv: 'conversion to can unsupported' ... есть ли вообще, чтобы остановить этот фильтр от удаленных файлов? – Adam

+0

Я использую это решение в течение длительного времени, и он отлично работает для msysgit до 1.9.5 в Windows. В последнем Git 2.x больше нет файла '.gitattributes'. У вас есть решение, которое также работает в последней версии Git? – Adam

2

Этот метод предназначен для MSysGit 1.8.1 и протестирован в Windows XP. Я использую Git Extensions 2.44, но поскольку изменения находятся на уровне Git, они должны работать и для Git Gui. Этапы:

  1. Установить Gnu Iconv.

  2. Создайте следующий скрипт, назовите его astextutf16, и поместить его в каталог/бен вашей установки Git (это основано на существующем astextplain сценарии):

    #!/bin/sh -e 
    # converts Windows Unicode (UTF-16/UCS-2) to Git-friendly UTF-8 
    # notes: 
    # * requires Gnu iconv: 
    #  http://gnuwin32.sourceforge.net/packages/libiconv.htm 
    # * this script must be placed in: ~/Git/bin 
    # * modify global ~/Git/etc/gitconfig or local ~/.git/config: 
    #  [diff "astextutf16"] 
    #   textconv = astextutf16 
    # * or, from command line: 
    #  $ git config diff.astextutf16.textconv astextutf16 
    # * modify global ~/Git/etc/gitattributes or local ~/.gitattributes: 
    #  *.txt diff=astextutf16 
    if test "$#" != 1 ; then 
        echo "Usage: astextutf16 <file>" 1>&2 
        exit 1 
    fi 
    # -f(rom) utf-16 -t(o) utf-8 
    "\Program Files\GnuWin32\bin\iconv.exe" -f utf-16 -t utf-8 "$1" 
    exit 0 
    
  3. Изменить глобальный ~/Git/и т.д./gitconfig или местный ~/.git файл/конфигурации, и добавить эти строки:

    [diff "astextutf16"] 
        textconv = astextutf16 
    
  4. или, из командной строки:

    $ git config diff.astextutf16.textconv astextutf16

  5. Изменение глобальных ~/Git/и т.д./gitattributes или локальный файл ~/.gitattributes и карту ваши расширения должны быть преобразованы:

    *.txt diff=astextutf16

  6. Test. Файлы UTF-16 теперь должны быть видны.

2

У меня возникла аналогичная проблема.

Я хотел бы улучшить принятый ответ, так как он имеет небольшой недостаток. Проблема я столкнулся в том, что, если файл не существует, я получил эту ошибку:

conversion to cannot unsupported 

Я изменил команды, так что файл не требуется. Он использует только stdin/stdout. Это устранило проблему. Мой файл .git/конфигурации теперь выглядит следующим образом:

[filter "mixedtext"] 
    clean = "GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP" 
    smudge = "GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP" 
    required = true 

Для создания записей в файле/.git конфигурации используйте следующие команды:

git config --replace-all filter.mixedtext.clean 'GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP' 
git config --replace-all filter.mixedtext.smudge 'GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP' 
git config --replace-all filter.mixedtext.required true 

Мой .gitattributes файл выглядит следующим образом:

*.txt filter=mixedtext 
*.ps1 filter=mixedtext 
*.sql filter=mixedtext 

Укажите только файлы, которые могут быть проблемой, в противном случае чистая/smudge должна выполнять больше работы (временные файлы).

Мы также массово преобразовали файлы UTF-16le в git в UTF-8, поскольку это самая компактная и портативная кодировка для UTF. Одна и та же команда iconv, используемая для очистки и размытия, была идеально подходит для постоянной конвертации файлов.

Приятная вещь о командах clean/smudge заключается в том, что даже если файл проверен, скажем, UTF-16le, diff все равно будет работать.

 Смежные вопросы

  • Нет связанных вопросов^_^