Пользователь
0,0
рейтинг
10 ноября 2009 в 16:11

Разработка → Особенности настройки git под windows

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
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)
Илья Маслаков @smind
карма
207,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (35)

  • 0
    Большое спасибо.
  • 0
    Хорошая статейка.
  • +2
    А почему нельзя редактировать сразу в utf8?
    • 0
      можно, отчего-ж нельзя, np++ или тот же far 2.х, но будут проблемы тогда при отображении списка новых/отредактированных файлов внутри коммита. Но в принципе не проблема…
      • 0
        Если не сложно, то распиши и этот путь джедая. Чтобы был выбор у народа :)
      • 0
        Если едитить в cp1251, то у народа с другими локалями будут траблы.
        • 0
          вы меня засомневали прям :), нет все ОК, проверил сейчас на машине с ru_RU.UTF-8
          проблем нет, т.к. внутри оно все в utf-8 хранится.
        • 0
          т.е. commitencoding только указывает в какой кодировки идет входящий текст коммита, а сам коммит внутри базы хранится в utf-8 и клиенту отдается в той кодировке в которой он просит согласно logoutputencoding.
          • 0
            Не совсем так
            i18n.commitencoding действительно указывает в какой кодировке был введён комментарий, но текст комментария вносится в объект коммита без изменений, а в заголовок объекта пишется кодировка комментария.
            Я не уверен только влияет-ли как-то этот заголовок на имя коммитера и автора.

            Так что в какой кодировке вводится комментарий — абсолютно всё равно, главное что-бы Git знал какая это кодировка. Git log и некоторые другие комманды используют этот заголовок что-бы во время вывода на экран производить перекодирование в нужную кодировку (в UTF-8 или в ту, которая указана в i18n.logoutputencoding). Но только для форматов oneline, short, medium, full, fuller. Если задать формат явно, например --format=%s, то первая строка комментария будет выведена без изменений.

            А вот с именами файлов беда. Если коротко — то лучше не пользоваться русскими именами файлов если с репозиторием будут работать под разными операционными системами.
  • 0
    >commitencoding = cp1251
    А потом на вас будут матерится пользователи *nix систем
    Лучше попробуйте
    code.google.com/p/tortoisegit/
    плюс нормальный редактор с поддержкой юникода, можно и far, насколько я помню у него нету беды с юникодом, можно и notepad++, я же вообще windows портом KDEшного kate пользуюсь
    • 0
      • 0
        Теперь спокоен :)
    • 0
      в совершенно правы tortoisegit хороший, нужный проект, просто мне удобны консольные утилиты, они есть в составе msysgit, и я написал как обойти некоторые проблемы работы git с консолью windows.
  • +2
    chcp 65001 и cmd.exe уже в utf-8
    • 0
      а имена русских файлов выглядят примерно так €€€€€€€€€€€€2009.xls…
      • 0
        в far-е (извиняюсь пропустил)
        • 0
          наврал… надо было после смены шрифта выйти из far и снова его запустить…
    • 0
      и да, к сожалению проблемы установка кодовой страницы utf-8 не решает… в отличии от описанного в топике.
  • 0
    Ай спасибо =)
    Русских имён файлов пока не было, но знаю, что уже всё хорошо, спасибо!
  • 0
    Сперва вы учите git понимать utf8, затем вы вдруг отказываетесь от utf8 в пользу старинной cp1251, а в конце вдруг выбираете кодировочку ещё древней — cp866 :)

    Не лучше ли будет оставить всё в utf8, чтобы везде было одинаково?
    • 0
      для виндовой консоли родная кодовая страница это 866, от того и все эти ухищрения, не более… под линуксом у меня везде ru_RU.UTF-8, там все эти лишние мероприятия вообще не нужны… так же не нужны они если вы собираетесь пользоваться графической оболочкой для git.
      • 0
        спасибо
        действительно, в консоли команда
        echo ыыы > ёёё.ййй
        создаёт файл «ёёё.ййй», но записывает в него вопросики :(
        это как-нибудь лечится?
        • 0
          Да. Не сочтите за рекламу, но попробуйте вот это.
          Правда здесь (http://wwarlock.blogspot.com/2009/06/utf-8-cygwin-17.html) для CygWin.
          • 0
            спасибо!
  • 0
    Параметр quotepath = false мне не помог.
    Команда git status выводит все, что угодно — вопросики, квадратики — но не русское имя.
    Пробовал: играться с chcp, переключаться между cmd, far2 и bash. Не помогло.

    Есть предположение, где грабли?

    P.S. ОС Windows 7 Russian, версия msysgit: 1.7.4-preview20110204
    • 0
      У меня тоже самое. Решение пока не нашел.
      Может кто-нибудь поможет нам?
      • 0
        Как вариант — забить на тупую консоль Windows и пользоваться gui клиентом. Лично я перешел на tortoisegit.
        • 0
          К сожалению, для проектом под Windows часто приходится делать различные действия в FAR-е (Total commander и другие).

          Если найду решение, напишу.
  • 0
    После долгих мучений получилось решить проблему скачиванием utf8-версии mysysgit.

    Сайт на японском, но ссылку на экзешник найти нетрудно.
    http://tmurakam.org/git/
    • 0
      Только он не официальный, и экзешник с левого сайта. Грустный вариант.
  • 0
    Для использования git submodule еще небольшие настройки нужно добавить:
    git config --global core.attributesfile "~/.gitattributes"
    И в сам .gitattributes добавить запись:
    .gitmodules eol=lf
  • 0
    Для тех, кто выйдет на эту заметку как и я, из гугла. Для решения проблем с utf8 есть дистр msysgit с поддержкой unicode. На момент написания этого коммента, самым свежим был этот code.google.com/p/msysgit/downloads/detail?name=Git-1.7.8-preview20111229-unicode.exe
  • 0
    Статья — просто класс! Обожаю такой материал: всё вместе, всё по теме и полно.
    Спасибо, большое.
  • 0
    Вот ссылка на правильный софт: code.google.com/p/utf8-git-on-windows/downloads/list
  • 0
    Git Bash.
    Пробовал всё, что описано в статье. Однако результат нулевой. Смотрю содержимое текстовых файлов:
    cat ansi.txt
    cat utf-8.txt
    

    Корректно отображается кириллица в содержимом только того файла, кодировка которого совпадает с кодировкой окна Options:

    image

    По мотивам проблемы создал две темы на stackoverflow: первая, вторая.

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