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

    Проблемы с русскими символами в 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)
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 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
                  в совершенно правы 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
                        Параметр 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: первая, вторая.

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