Время на прочтение3 мин
Количество просмотров109K
Проблемы с русскими символами в 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)
Gitconfig для Windows исправить кракозябры в сообщениях git log с русскими комменариями к коммиту
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; почерпнуто из https://habr.com/ru/post/74839/ | |
; чтобы видеть нормально русские символы для git reflog нужно еще iconv | |
[core] | |
repositoryformatversion = 0 | |
filemode = false | |
bare = false | |
logallrefupdates = true | |
symlinks = false | |
ignorecase = true | |
quotepath = false | |
pager = cat|more.com | |
; альтернатива, скачать: iconv.exe, libcharset1.dll, libiconv2.dll, libintl3.dll (http://gnuwin32.sourceforge.net/packages/libiconv.htm) и положить рядом с git.exe | |
; заменить опцию pager на | |
; pager = iconv.exe -f cp1251 -t utf-8 | less | |
editor = \»C:\\Users\\User1\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\» —wait | |
[i18n] | |
commitencoding = cp1251 | |
logoutputencoding = cp866 |
Предисловие
Когда я впервые столкнулся с Git, я прочитал официальную книгу Pro Git, но так и не смог запомнить никаких командных строк во время фактической работы, поэтому я напрямую стал использовать Git-GUI. Но даже в использовании графического интерфейса у меня возникали сложности, так как он был на английском(((
Установочный пакет Git, загруженный с официального сайта, имеет только английский интерфейс и никаких других языков. Документы на русском языке, которые можно найти в Интернете, вероятно, более 10-летней давности.
Содержимое самого языкового файла представляет собой обычный текст, формат которого соответствует определенной спецификации, а инструменты также доступны в исходном коде. Специально для вас я собрал вручную все необходимые файлы для локализации, теперь вам надо разбираться в спецификациях и использовать специальные инструменты, достаточно просто загрузить приложенные файлы в нужный раздел каталога Git.
Локализация Git Bash
Русская локализация Git Bash очень проста. Вам нужно только щелкнуть правой кнопкой мыши на командную строку, выбрать Options/Window, а затем установить язык на русский.
Локализация Git GUI
Но вот графический интерфейс Git, не так легко установить на русском языке. Открыв настройки, все из которых являются английскими, и после долгого поиска я так не нашел соответствующие языковые настройки. Так как мне установить русский язык отображение в Git GUI?
Все очень просто! На самом деле, Git GUI не имеет опциональной языковой настройки. К счастью, некоторые пользователи интернета разработали соответствующий русский пакет. Нам нужно только загрузить и установить его.
Пример такого пакета можно скачать здесь.
После загрузки, поместите содержимое архива по следующему пути в \git\mingw64\share\.
Внимание! В ходе установки Git не создается папка MSGS. Это нормально!
Когда вы открываете программное обеспечение, вы обнаружите, что программный интерфейс стал на русском)))
Локализация Gitk
Отлично! Мы перевели на русский Git Bash и Git GUI. Но открыв историю веток репозитория (Gitk) мы увидим что он все еще на английском(((
Так как же нам его перевести? Все аналогично Git GUI! Нам надо добавить в папку с Git нужные файлы для локализации Gitk.
Читай рецепт тут.
Корректное отображение русских букв в Git GUI и Gitk
Ну вот и все! Мы перевели английский Git на русский
Но есть один нюанс… Что это за инопланетные иероглифы???
А это у нас не корректно отображается кодирвка! Выставь в настройках кодировку UTF-8 и все будет ОК!
УРА!!! Все готово!!!
Выбор русского языка в Git Extension
Git Extensions это графическая программа для работы с Git.
Git Extensions позволяет использовать Git без консоли.
Почитать документацию можно на официальном сайте: gitextensions.github.io
По умолчанию Git Extensions устанавливается с английским интерфейсом, но его можно изменить на русский!
Для того чтобы выбрать русский язык, нажмите на Repair и выберите Russian
Вуаля!!! У нас теперь есть полноценный графический Git на русском языке!!! Пользуйтесь!!!
Вернее сказать настройка правильного отображения русских шрифтов (кириллицы) в Git.
В этом посте я приведу несколько примеров использования кириллицы в Git. Сразу хочу сказать, что Git по умолчанию нормально работает с юникод, поэтому лучше сразу вести вести все свои проекты в юникод, если это возможно конечно.
И так сперва рассмотрим как Git работает с русским языком в юникод.
Создадим каталог UTFtest и в нем репозитарий Git. Дополнительных настроек ни каких не делаем, кроме как задаем имя и email пользователя.
Теперь создаем текстовый файлик TestUTF.txt в кодировке юникод. Я использовал для этого Notepad++, но можно и любой другой, главное чтобы он поддерживал создание файлов в юникод без BOM.
В настройках Notepad++ отключение BOM выглядит так
И так мы создали файлик, теперь, посмотрим статус, добавим файл в индекс и сделаем первый коммит.
И так мы сделали первый коммит нашего файла. Git правда предупредил, что он подозревает что мой терминал не поддерживает юникод, и дал совет как это можно исправить. Но это на самом деле не так. Мой терминал поддерживает юникод. И сейчас мы в этом убедимся.
Добавим в наш файлик вторую строчку.
Теперь опять посмотрим статус, добавим изменения в индекс и закоммитим.
Помним, что мы редактировали файлик в кодировке юникод (UTF) без BOM.
Теперь посмотрим простой лог наших изменений.
Git вывел краткую информацию о наших коммитах. Кто, когда, комментарий и контрольную сумму каждого коммита.
Теперь посмотрим дельту, разницу между нашими коммитами, то есть более подробно, что было изменено.
Как видим Git показал нам что было изменено в файле во втором коммите при сравнении его с первым коммитом.
Пока не будем вдаваться в подробности всего вывода информации. Сейчас главное что русский текст комментариев к коммитам, а так же русский текст в текстовом файле при выводе дельты в логе отображается правильно.
От сюда вывод, что Git по умолчанию использует UTF-8 и как следствие с русским языком проблем не возникает.
Теперь на всякий случай покажу что же такое этот BOM и как сей зверь выглядит в коммитах.
Для этого создам текстовый файл в Far Manager, добавлю его в индекс, закоммитю, добавлю в файлик еще одно строчку и снова сделаю коммит.
Хотя в редакторе Far manager служебного кода BOM не видно, но он там есть
На заметку: В редакторе Far manager, так же можно отключить создание BOM метки.
Все! Мы убедились, что при использовании кодировки UTF-8 ни каких проблем с русским языком, как в комментариях к коммитам, так и с просмотром русского текста в дельте логов, не возникает. И при этом не надо делать ни каких дополнительных настроек.
Исключение может составлять только если у вас есть файлы с русскими именами. Приведу примерчик. Создам файл Русский.txt. И посмотрим статус и содержимое каталога в консоли.
Вот как выводит консоль имена файлов на русском языке.
Чтобы это подправить дадим команду
$ git config —local core.quotepath false
И снова посмотрим статус и содержимое каталога в директории
Теперь Git стал нормально отображать русские названия файлов. А вот линуксовая утилитка ls с русским не подружилась (вернее сказать bash не подружился), но это ни какого отношения к Git не имеет.
Но если очень хочется то можно заставить ls выводить русские имена файлов правильно задав дополнительный ключик
$ ls —show-control-chars
Теперь добавим на наш файлик Русский.txt в индекс и закоммитим его. Потом добавим в этот файл строку и снова закоммитим. А затем посмотрим дельту
Как видим с русским языком снова все хорошо. То есть дополнительная настройка понадобилась только в том случае, когда есть файлы с названиями на русском языке.
Теперь настроим Git на работу с русской кодировкой Windows (CP 1251)
Создадим каталог CP1251 и Git репозитарий в нем. Затем создадим файлик Win.txt в стандартной кодировке Windows. Посмотрим статус, добавим этот файл в индекс и закоммитим его.
Напомню что все это дается с установками Git по умолчанию.
Теперь добавлю в файлик Win.txt еще одну строчку и закоммичю его, а затем посмотрим дельту, то есть разницу между первым и вторым коммитом.
И так смотрим разницу между коммитами
Ууууупс! Что за ерунда???? Видим что комментарии к коммитам отображаются правильно, так как они в юникоде (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)
Теперь посмотрим еще раз дельту
Мы видим что теперь содержимое файлов в дельте отображается правильно, а вот комментарии к коммитам стали отображаться не правильно. Это произошло потому, что весь вывод команды git log, конвертируется и строчки комментариев были рассмотрены как-будто они в кодировке cp1251.
Попробуем исправить и это командами
$ git config —local i18n.commitEncoding utf8
$ git config —local i18n.logoutputencoding cp1251
Я несколько раз поправил файлик. Посмотрим два последних коммита и их дельту.
Как видно почти все отображается нормально. Исключение составляет только вывод после команды git commit (я его подчеркнул красной чертой и подсветил желтым). С этим можно конечно смирится если очень хочется вести проект в кодировке Windows CP1251. Как поправить этот маленький недочет я не знаю. Может кто подскажет – буду очень признателен.
Просто git log без дельты тоже выводит все нормально
Файл настроек Git для данного проекта CP1251 выглядит так:
Но вообще лучше вести проекты в UTF-8
Этот пост не обновлялся уже более года. Информация, описанная ниже, могла потерять актуальность, но всё ещё может быть полезна.
Ситуация: изначально все файлы в репозитории были в кодировке cp-1251 (aka win-1251), но в какой-то момент было решено перейти на utf-8. Разработка ведётся на Windows.
Проблема: некорректное отображение кириллицы в оболочке git bash при выполнении команд git log, git diff, git show, etc; белиберда в сообщениях коммитов.
Задача: исправить отображение кириллицы.
Бонус: кириллица будет верно отображаться в GitLab.
Перед началом
Считаем, что все файлы в репозитории уже пересохранены в utf-8 без BOM и что работа с репозиторием ведётся через git bash. Остальные клиенты не рассматриваем.
Результат операции — полностью новый репозиторий. Его придётся заново копировать всем участникам разработки и у каждого настраивать кодировки.
Делаем резервную копию директорию, с которой будем работать. Лучше несколько раз. Каждую копию заархивировать и каждый архив скопировать ещё несколько раз.
Если нужно — создаём новый удалённый репозиторий. Если был — переименовываем старый и создаём новый с прежним именем.
Важно прочесть и ПОНЯТЬ следующее:
- Изменение кодировки git репозитория
- Настройка русских шрифтов в Git
Иначе даже не начинай думать готовиться приступать.
Решение
Открываем git bash, жмём ПКМ > Options… > Text. Ставим там Locale = ru_RU и Character set = UTF-8. Шрифт (Font) должен поддерживать кириллицу.
Далее задаём настройки в файле config репозитория:
[core]
...
quotepath = false
[i18n]
# кодировка сообщений коммитов
commitencoding = cp1251
# кодировка вывода в консоль, если не задана, то == commitencoding
logoutputencoding = cp866
Переходим в рабочую директорию проекта и смотрим кодировку коммитов:
git log --pretty="%h [%e] %s"
Вывод будет приблизительно таким:
495d3cb [cp1251] Popups png -> jpg
fc0961e [cp1251] Keyboard png -> jpg
8665af6 [cp1251] Buttons png -> jpg
27fa7c0 [cp1251] Backgrounds png -> jpg
...
Сначала идёт короткий хеш коммита, в квадратных скобках — его кодировка (может быть пустой), а далее его комментарий. Комментарии на кириллице могут отображаться коряво, если ранее настройки git bash не менялись (или стояли отличные, от указанных выше) и работа в консоли велась в другой кодировке.
Запускаем перекодирование:
git filter-branch --msg-filter 'iconv -c -s -f CP1251 -t UTF-8' --tag-name-filter 'cat' -- --all HEAD
Тепреь можно обновлять свой remote. Остальным участникам разработки остаётся только получить свежий репозиторий и работать уже с ним. Вопросы переноса чужих наработок, не попавших в новый перекодированный репозиторий, оставляю за кадром.