今日、かなり古い perforce リポジトリを git に移行する立場にいます。これは非常に興味深いことですが、私の目を引いたことが 1 つあります。コミット メッセージ内のすべての特殊文字、および作成者名でさえ、正しいエンコーディングではありません。
そこで、問題の原因を調査しようとしました。
- まず、perforce サーバーは Unicode をサポートしていないため、P4CHARSET を設定しても効果はありませんが、
Unicode clients require a unicode enabled server.
p4 users
次に、ANSIで実際にwhereのような単純なコマンドの出力を確認しました(file -bi
リダイレクトされた出力に応じて、メモ帳++またはISO-8859-1を参照してください)- コマンドは
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
しかし、特に著者名を書き換えることを意図していないため、問題は解決しません。
git-p4 がそれらを受信する前に、出力を強制的に UTF-8 に変換する方法を誰かが推測していますか?
アップデート:
デフォルトのp4コマンド出力を、PATHの前に追加した単純なシェルスクリプトで「上書き」しようとしました
/usr/bin/p4 $@ | iconv -f iso-8859-1 -t utf-8
しかし、それは明らかに使用されているマーシャリングされた python オブジェクトを破壊します:
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
アップデート2:
ここで見られるように Python のデフォルトのエンコーディングを変更しますか? Pythonエンコーディングをasciiに設定しようとしました:
export export PYTHONIOENCODING="ascii"
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
出力:
('ascii', 'ascii')
しかし、まだすべてのメッセージと作成者が正しく移行されていません。
更新 3:
git-p4.pydef commit(self, details, files, branch, parent = "")
関数にパッチを当てようとしても役に立ちませんでした:
self.gitStream.write(details["desc"])
それらの1つに
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)
私は Python 開発者ではないので、次に何を試せばよいかわかりません。