git-p4 消息和作者编码
git-p4 message and author encoding
今天我可以将一些非常旧的 perforce 存储库迁移到 git。虽然这真的很有趣,但有一件事引起了我的注意。提交消息中的所有特殊字符甚至作者姓名的编码都不正确。
所以我试图调查问题出在哪里。
- 首先perforce服务器不支持unicode,所以设置P4CHARSET没有效果但是
Unicode clients require a unicode enabled server.
- 然后我检查了像
p4 users
这样的简单命令的输出,它确实在 ANSI 中(咨询记事本 ++,或根据 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 吗?
更新:
我尝试 "overwrite" 使用一个简单的 shell 脚本输出默认的 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:
如此处所示 Changing default encoding of Python? 我尝试将 python 编码设置为 ascii:
export export PYTHONIOENCODING="ascii"
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
输出:
('ascii', 'ascii')
但仍然没有正确迁移所有消息和作者。
更新 3:
甚至尝试修补 git-p4.py 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)
因为我不是 python 开发人员,所以我不知道接下来要尝试什么。
我怀疑details["desc"]
的类型是字节串。 (python2 的 str)。
因此,在 encode
之前,您需要将其 decode
转换为 Unicode。
print type(details["desc"])
找出类型。
details["desc"].decode("iso-8859-1").encode("UTF-8")
可能有助于从 iso-8859-1 转换为 UTF-8。
今天我可以将一些非常旧的 perforce 存储库迁移到 git。虽然这真的很有趣,但有一件事引起了我的注意。提交消息中的所有特殊字符甚至作者姓名的编码都不正确。
所以我试图调查问题出在哪里。
- 首先perforce服务器不支持unicode,所以设置P4CHARSET没有效果但是
Unicode clients require a unicode enabled server.
- 然后我检查了像
p4 users
这样的简单命令的输出,它确实在 ANSI 中(咨询记事本 ++,或根据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 吗?
更新:
我尝试 "overwrite" 使用一个简单的 shell 脚本输出默认的 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:
如此处所示 Changing default encoding of Python? 我尝试将 python 编码设置为 ascii:
export export PYTHONIOENCODING="ascii"
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
输出:
('ascii', 'ascii')
但仍然没有正确迁移所有消息和作者。
更新 3:
甚至尝试修补 git-p4.py 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)
因为我不是 python 开发人员,所以我不知道接下来要尝试什么。
我怀疑details["desc"]
的类型是字节串。 (python2 的 str)。
因此,在 encode
之前,您需要将其 decode
转换为 Unicode。
print type(details["desc"])
找出类型。
details["desc"].decode("iso-8859-1").encode("UTF-8")
可能有助于从 iso-8859-1 转换为 UTF-8。