Устранение проблем с русскими символами в git


Проблемы с русскими символами в git
Когда вы начнете работать с версией git под windows в командной строке, вы столкнётесь со следующей проблемой -- все сообщения git, в которых фигурируют русские символы будут нечитаемы. Имена файлов, на русском языке, будут выглядеть так -- "\362\345\361\362", а тексты коммитов примерно так -- <C8><ED><E8><F6><E8><E0><EB><E8><E7><E0><F6><E8><FF> <EF><F0><EE><E5><EA><F2><E0>. Т.е. исходная строка преобразуется в utf8 в соответствии с кодировкой latin1.
Устранение проблем
Для примера я создал каталог rep на диске C:, создал в нем новый файл с именем тест и инициализировал новый репозиторий. После этого добавил в репозиторий все файлы из текущего каталога.
C:\rep>git init
Initialized empty Git repository in C:/rep/.git/

C:\rep>git add .
Видно что файлы с русскими буквами, показываются не в той кодировке, в которой бы мы смогли их без проблем прочесть.
C:\rep>git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       "\362\345\361\362"
nothing added to commit but untracked files present (use "git add" to track)
Чтобы исправить такое поведение git необходимо изменить параметр quotepath в секции [core], установив его в false.
quotepath = false
NB: Поменять можно либо глобальный файл настроек либо локальный. Глобальный файл настроек находится здесь C:\Program Files\Git\etc\gitconfig, локальный в каталоге репозитория .git\config. Следующая проблема возникает при редактировании описания коммита.
C:\rep>git commit -a -s
Если отредактировать и сохранить коммит в 8-битной кодировке, то появится следующее сообщение:
Warning: commit message does not conform to UTF-8.
You may want to amend it after fixing the message, or set the config
variable i18n.commitencoding to the encoding your project uses.
[master (root-commit) cc05f8a] ╚эшЎшрышчрЎш  яЁюхъЄр Signed-off-by: maslakov <maslakov@mail.local>
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 "\362\345\361\362"
Соответственно необходимо указать кодировку в которой будут вносится описания коммитов, в секции [i18n], параметр commitencoding
commitencoding = cp1251
Третья проблема, которая возникает при работе с консольным интерфейсом git в это вывод лога:
C:\rep>git log
по умолчанию он выглядит так
commit cc05f8a470e8602ded60ba9c979c93148b334d4e
Author: maslakov <maslakov@mail.local>
Date:   Tue Nov 10 12:37:38 2009 +0300
    <C8><ED><E8><F6><E8><E0><EB><E8><E7><E0><F6><E8><FF> <EF><F0><EE><E5><EA><F2><E0>
    Signed-off-by: maslakov <maslakov@mail.local>
Как показало вскрытие в этом "виновата" утилита less, убедить её показывать текст правильно поможет установка переменной окружения LESSCHARSET=koi8-r или можно просто указать в качестве вьювера утилиту cat. Чтобы текст показывался постранично, передать вывод утилиты cat утилите more. Кроме того необходимо задать параметр logoutputencoding в секции [i18n]
logoutputencoding = cp866
В принципе, после установки вышеуказанных настроек, основные проблемы использования национальных языков, в 8-битyных кодировках, будут решены. Вот мой файл \.git\config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        quotepath = false 
        pager = cat|more.com
        editor = far -e
[i18n]
        commitencoding = cp1251
        logoutputencoding = cp866
Текст коммитов я редактирую в far, поэтому параметр editor у меня определен как far -e Надеюсь кому-то данная информация будет полезна... UPD: спасибо Алексею Шумкину за дополнение
ashu> я нашёл решение для less http://www.linuxcenter.ru/lib/books/kostromin/gl_11_05.phtml вкратце - нужно установить переменную окружения LESSCHARSET=koi8-r (у меня под Cygwin 1.5 заработало) UPD2: спасибо за дополнение
К сожалению, приведенные решения не помогли побороть проблему с выводом русских символов в выводе команд git diff, git show. К установленному Git в каталог bin скопировал iconv.exe, а в конфиг Git'а прописал: pager = iconv.exe -f cp1251 -t utf-8 | less файлы проекта у меня соответственно в кодировке cp1251. Файл iconv.exe можно найти скачав архив с бинарными файлами проекта iconv под Windows http://gnuwin32.sourceforge.net/packages/libiconv.htm. Дополнительно к нему понадобяться dll: libcharset1.dll libiconv2.dll (у меня уже был в установке Git, заменять не стал) libintl3.dll ( из архива Dependencies, оттуда же откуда качается iconv)