Проблемы с русскими символами в 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-битных кодировках, будут решены.
Вот мой файл \.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: спасибо hokum за дополнение
К сожалению, приведенные решения не помогли побороть проблему с выводом русских символов в выводе команд git diff, git show.
К установленному Git в каталог bin скопировал iconv.exe, а в конфиг Git'а прописал:
pager = iconv.exe -f cp1251 -t utf-8 | less
файлы проекта у меня соответственно в кодировке cp1251.
Файл iconv.exe можно найти скачав архив с бинарными файлами проекта iconv под Windows gnuwin32.sourceforge.net/packages/libiconv.htm.
Дополнительно к нему понадобяться dll:
libcharset1.dll
libiconv2.dll (у меня уже был в установке Git, заменять не стал)
libintl3.dll ( из архива Dependencies, оттуда же откуда качается iconv)