четверг, 5 февраля 2015 г.

Настройка русских шрифтов в Git

Вернее сказать настройка правильного отображения русских шрифтов (кириллицы) в Git.

В этом посте я приведу несколько примеров использования кириллицы в Git. Сразу хочу сказать, что Git по умолчанию нормально работает с юникод, поэтому лучше сразу вести вести все свои проекты в юникод, если это возможно конечно.

И так сперва рассмотрим как Git работает с русским языком в юникод.

Создадим каталог UTFtest и в нем репозитарий Git. Дополнительных настроек ни каких не делаем, кроме как задаем имя и email пользователя.

UTF00001

Теперь создаем текстовый файлик TestUTF.txt в кодировке юникод. Я использовал для этого Notepad++, но можно и любой другой, главное чтобы он поддерживал создание файлов в юникод без BOM.

UTF00002

В настройках Notepad++ отключение BOM выглядит так

UTF00003

И так мы создали файлик, теперь, посмотрим статус, добавим файл в индекс и сделаем первый коммит.

UTF00004

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

Добавим в наш файлик вторую строчку.

UTF00005

Теперь опять посмотрим статус, добавим изменения в индекс и закоммитим.

UTF00006

Помним, что мы редактировали файлик в кодировке юникод (UTF) без BOM.

Теперь посмотрим простой лог наших изменений.

UTF00007

Git вывел краткую информацию о наших коммитах. Кто, когда, комментарий и контрольную сумму каждого коммита.

Теперь посмотрим дельту, разницу между нашими коммитами, то есть более подробно, что было изменено.

UTF00008

Как видим Git показал нам что было изменено в файле во втором коммите при сравнении его с первым коммитом.

Пока не будем вдаваться в подробности всего вывода информации. Сейчас главное что русский текст комментариев к коммитам, а так же русский текст в текстовом файле при выводе дельты в логе отображается правильно.

От сюда вывод, что Git по умолчанию использует UTF-8 и как следствие с русским языком проблем не возникает.

Теперь на всякий случай покажу что же такое этот BOM и как сей зверь выглядит в коммитах.

Для этого создам текстовый файл в Far Manager, добавлю его в индекс, закоммитю, добавлю в файлик еще одно строчку и снова сделаю коммит.

UTF00009

Хотя в редакторе Far manager служебного кода BOM не видно, но он там есть Улыбка

На заметку: В редакторе Far manager, так же можно отключить создание BOM метки.

Все! Мы убедились, что при использовании кодировки UTF-8 ни каких проблем с русским языком, как в комментариях к коммитам, так и с просмотром русского текста в дельте логов, не возникает. И при этом не надо делать ни каких дополнительных настроек.

Исключение может составлять только если у вас есть файлы с русскими именами. Приведу примерчик. Создам файл Русский.txt. И посмотрим статус и содержимое каталога в консоли.

UTF00010

Вот как выводит консоль имена файлов на русском языке.

Чтобы это подправить дадим команду

$ git config --local core.quotepath false

И снова посмотрим статус и содержимое каталога в директории

UTF00011

Теперь Git стал нормально отображать русские названия файлов. А вот линуксовая утилитка ls с русским не подружилась (вернее сказать bash не подружился), но это ни какого отношения к Git не имеет.

Но если очень хочется то можно заставить ls выводить русские имена файлов правильно задав дополнительный ключик

$ ls --show-control-chars

UTF00013

Теперь добавим на наш файлик Русский.txt в индекс и закоммитим его. Потом добавим в этот файл строку и снова закоммитим. А затем посмотрим дельту

UTF00012

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

Теперь настроим Git на работу с русской кодировкой Windows (CP 1251)

Создадим каталог CP1251 и Git репозитарий в нем. Затем создадим файлик Win.txt в стандартной кодировке Windows. Посмотрим статус, добавим этот файл в индекс и закоммитим его.

UTF00014

Напомню что все это дается с установками Git по умолчанию.

Теперь добавлю в файлик Win.txt еще одну строчку и закоммичю его, а затем посмотрим дельту, то есть разницу между первым и вторым коммитом.

UTF00015

И так смотрим разницу между коммитами

UTF00016

Ууууупс! Что за ерунда???? Видим что комментарии к коммитам отображаются правильно, так как они в юникоде (UTF-8), а вот содержимое файлов у нас идет кодами, что не очень то удобно, верней вообще не удобно. Это происходит потому, что вывод команды git log, так же происходит в UTF-8.

Попробуем поправить ситуацию. Дадим команду

$ git config --local core.pager "iconv.exe -f cp1251 -t utf-8 | less"

Данная команда переопределяет вывод пейджера (программы less, стандартной линуксовой программы постраничного вывода). Она конвертирует кодовую страницу cp1251 в UTF-8, как видно из синтаксиса команды iconv.exe.

iconv.exe идет вместе с дистрибутивом Git, поэтому нет смысла качать дистрибутив с сайта. Единственное ей могут понадобится дополнительные библиотеки, которые можно скачать тут. Нужно выбрать Dependencies (zip)

UTF00018

Теперь посмотрим еще раз дельту

UTF00017

Мы видим что теперь содержимое файлов в дельте отображается правильно, а вот комментарии к коммитам стали отображаться не правильно. Это произошло потому, что весь вывод команды git log, конвертируется и строчки комментариев были рассмотрены как-будто они в кодировке cp1251.

Попробуем исправить и это командами

$ git config --local i18n.commitEncoding utf8

$ git config --local i18n.logoutputencoding cp1251

Я несколько раз поправил файлик. Посмотрим два последних коммита и их дельту.

UTF00019

Как видно почти все отображается нормально. Исключение составляет только вывод после команды git commit (я его подчеркнул красной чертой и подсветил желтым). С этим можно конечно смирится если очень хочется вести проект в кодировке Windows CP1251. Как поправить этот маленький недочет я не знаю. Может кто подскажет – буду очень признателен.

Просто git log без дельты тоже выводит все нормально

UTF00020

Файл настроек Git для данного проекта CP1251 выглядит так:

UTF00022

UTF00021

Но вообще лучше вести проекты в UTF-8

14 комментариев:

  1. Используя 1й метод (ведя проект в кодировке UTF8) как и где можно прописать, чтобы вместо ls --show-control-chars просто писать ls. Где-то же это, наверное можно прописать? Ведь оно фактически нужно всегда только в виде ls --show-control-chars на русской версии windows? Спасибо за ответ, заранее!

    ОтветитьУдалить
  2. Кстати по поводу моего поста выше, команда git ls-files тоже выводит файлы с русскими буквами в названии корректно, не взирая в windows-1251 он или в UTF8 :)

    ОтветитьУдалить
  3. вот тут ответ http://pr0git.blogspot.ru/2015/02/git-bash.html

    ОтветитьУдалить
  4. ls -l --color=tty --sort=extension --show-control-chars — и все равно видим крякозябры

    ОтветитьУдалить
  5. Что за редактор тёплый ламповый такой?

    ОтветитьУдалить
    Ответы
    1. Похож на Borland 3.1

      Удалить
    2. Да похоже вы не жили в эпоху Win95 не говоря уже про PDP11.
      Это Far Manager. Очень рекомендую

      Удалить
  6. Здравствуйте!
    Подскажите, пожалуйста, а есть ли какой-нибудь способ заставить git grep искать текст на русском в файлах с кодировкой Win-1251?

    ОтветитьУдалить
    Ответы
    1. Ни когда этим не озадачивался.

      Удалить
    2. Если кому-то ещё это интересно, мне на этот вопрос ответили на stackoverflow: https://stackoverflow.com/questions/63100662/how-to-use-git-grep-to-search-for-8-bit-encoded-text-in-a-files-with-the-same

      Удалить
  7. К меня FAR, файлы в utf-8, комментарии к комитам тоже на utf-8. Но команда >git log выводит на экран названия коммитов в виде .., как бы я не настраивал config. Есть работающий config для такого случая?

    ОтветитьУдалить
  8. Аналогично. Никак не получается, чтобы и комментарии и файлы показывались кириллицей.

    ОтветитьУдалить
  9. Скачал версию 2.30 (64) - заработало!, в секцию [core] добавлено только quotepath = false

    ОтветитьУдалить