У меня есть репозитории Mercurial, работающие на Apache с mod_wsgi. Все имена файлов в репозиториях закодированы в windows-1251. Эта кодировка используется по историческим причинам: они были преобразованы в mercurial из svn, windows-1251 является кодировкой Windows по умолчанию для русской локали.
Теперь программисты хотят использовать Тигель инструмент для обзора кода. Он не может указывать имена файлов в любой другой кодировке, кроме utf-8. Поэтому мне нужно преобразовать их из windows-1251 в utf-8. Кто-нибудь знает как это сделать? Расширение Mercurial convert не имеет параметров для преобразования кодировок.
hgweb.config:
[web]
#encoding = UTF-8
encoding = windows-1251
#allow_archive = gz, zip, bz2
allow_archive = zip
allow_push = *
push_ssl = false
[extensions]
[collections]
/data/mercurial = /data/mercurial
Вы правы, что расширение convert не поддерживает это в настоящее время. То есть нельзя попросить его перекодировать из кодировки Икс кодировать Y. Однако вы можете попросить его переименовать файлы по одному за вас! Сначала создайте файл с именем rename.py
с участием
import sys
for path in sys.stdin:
old = path[:-1] # strip newline
new = old.decode("cp1251").encode("utf-8")
print 'rename "%s" "%s"' % (old, new)
Тогда беги
$ hg manifest --all | python rename.py > rename.txt
Это создает вашу карту файлов. Теперь вы можете использовать
$ hg convert --filemap rename.txt cp1251-repo utf-8-repo
чтобы преобразовать репозиторий в новый репозиторий. В новом репозитории это будет выглядеть так, как будто файлы всегда сохранялись с использованием имен файлов UTF-8.
Примечание: Имена файлов теперь хранятся в репозитории как UTF-8. Это означает, что оформление заказа будет хорошо смотреться на современных машинах Linux. Однако Windows не использует имена файлов UTF-8. В Расширение FixUtf-8 необходимо использовать, чтобы Mercurial на лету преобразовывал имена файлов UTF-8 в UTF-16. Это также создаст читаемые имена файлов в Windows.
Примечание: Всем придется заново клонировать новый репозиторий! Изменение любой части истории неизбежно изменяет хеши всех ревизий. Итак, чтобы осуществить это, вам нужно либо
или
Любой способ работает, поскольку преобразование является детерминированным, и ваши пользователи могут запускать его сами, если у них есть Python. Если у них есть только установка TortoiseHg, то, вероятно, проще всего конвертировать для них на своем сервере.
Я посмотрел на то, чтобы расширение convert поддерживало это более непосредственно, и отправили патч в список рассылки Mercurial для более прямой поддержки этого.
У меня такая же проблема. Мне нужно было преобразовать кучу репозиториев, поэтому я написал скрипт, который конвертирует все репозитории, указанные в виде списка.
использование:
hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]]
Вы можете получить от мой репозиторий в BitBucket.
Просто извлечение из Mercurial Вики К вашему сведению
Следующие данные явно рассматриваются как двоичные данные в неизвестной кодировке:
- содержимое файла
- имена файлов
Эти элементы следует рассматривать как двоичные данные и, по возможности, сохранять без потерь.
Таким образом, я полагаю, просто меняя кодировку презентации в encoding =
может сделать толстый
Если это предположение неверно (это всегда возможно), попробуйте Расширение FixUtf8, прочтите часть Исправление существующих имен файлов из readme внимательно