Смена кодировки git-репозитория с CP-1251 на 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 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. Остальным участникам разработки остаётся только получить свежий репозиторий и работать уже с ним. Вопросы переноса чужих наработок, не попавших в новый перекодированный репозиторий, оставляю за кадром.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *