2015-05-13 2 views
3

сегодня я могу перенести некоторые довольно старые 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) 

, как я не являюсь разработчиком питона я понятия не имею, что к попробуйте следующий.

ответ

1

Я подозреваю, что тип details["desc"] является байтовой строкой. (str для python2).

Поэтому вам нужно decode его в Юникод перед вами encode it.

print type(details["desc"]) 

, чтобы узнать об этом.

details["desc"].decode("iso-8859-1").encode("UTF-8") 

может помочь с переводом с iso-8859-1 на UTF-8.

+0

Отлично, что сделал трюк (точное изменение было 'self.gitStream.write (подробности [" desc "]. Decode ('iso-8859-1'). Encode ('utf8'))'). Я изменил не только вышеупомянутую строку, но и в def 'def make_email (self, userid):' строка 'return self.users [userid]'. – dag