сегодня я могу перенести некоторые довольно старые perforce репозитории в git. Хотя это действительно интересно, есть одна вещь, которая привлекла мое внимание. Все специальные символы в сообщениях фиксации и даже имена авторов не соответствуют правильной кодировке.git-p4 сообщение и кодировка автора
Итак, я попытался выяснить, откуда возникла проблема.
- прежде всего неволей сервер не поддерживает юникод, поэтому установка P4CHARSET не имеет никакого эффекта, но
Unicode clients require a unicode enabled server.
- затем я проверил вывод простых команд, как
p4 users
Wich, где на самом деле в ANSI (консультационного Notepad ++ или ISO -8859-1 согласноfile -bi
на перенаправлены выходе) - команда
locale
говорит LANG = en_US.UTF-8 ...
ведь я думаю, что все выходные p4 клиент находится в ISO-8859- 1, но git-p4 вместо этого использует UTF-8.
Я пытался переписывать коммиты с
git filter-branch --msg-filter 'iconv -f iso-8859-1 -t utf-8' -- --all
но то не исправить проблемы, Especialy как он не предназначен для перезаписи имен авторов.
У кого-нибудь есть предположение, как заставить вывод быть переведенным в UTF-8 до того, как git-p4 получит их?
Update:
я попытался «перезаписать» p4 по умолчанию команды вывода с простым скриптом, который я предварённый в PATH
/usr/bin/p4 [email protected] | iconv -f iso-8859-1 -t utf-8
но destoys на выстроили объекты питона, которые, очевидно, используется:
File "/usr/local/bin/git-p4", line 2467, in getBranchMapping
for info in p4CmdList(command):
File "/usr/local/bin/git-p4", line 480, in p4CmdList
entry = marshal.load(p4.stdout)
ValueError: bad marshal data
Update2:
Как видно здесь Changing default encoding of Python? я попытался установить кодировку питона в ASCII:
export export PYTHONIOENCODING="ascii"
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
Выход:
('ascii', 'ascii')
, но до сих пор все сообщения и авторы не правильно мигрировали.
Update 3:
Даже пытаясь залатать ГИТ-p4.ру def commit(self, details, files, branch, parent = "")
функция не помогло: Изменение
self.gitStream.write(details["desc"])
к одному из тех
self.gitStream.write(details["desc"].encode('utf8', 'replace'))
self.gitStream.write(unicode(details["desc"],'utf8')
было просто поднять:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 29: ordinal not in range(128)
, как я не являюсь разработчиком питона я понятия не имею, что к попробуйте следующий.
Отлично, что сделал трюк (точное изменение было 'self.gitStream.write (подробности [" desc "]. Decode ('iso-8859-1'). Encode ('utf8'))'). Я изменил не только вышеупомянутую строку, но и в def 'def make_email (self, userid):' строка 'return self.users [userid]'. – dag