我使用mod_wsgi在Apache上运行Mercurial存储库。 存储库具有编码在windows-1251中的所有文件名。 这个编码用于历史原因:它们被转换为svn的mercurial,windows-1251是俄语区域设置的默认窗口编码。
现在程序员想要使用Crucible工具进行代码审查。 它不能用UTF-8以外的任何编码来压缩文件名。 所以我需要将它们从windows-1251转换为utf-8。 有谁知道如何做到这一点? Mercurial转换扩展没有选项来转换编码。
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
你是对的,转换扩展目前不是很好的支持这个。 也就是说,你不能要求它从编码X重新编码到编码Y. 但是,您可以要求它为您逐个重命名文件! 首先创build一个名为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
这将创build您的文件映射。 你现在可以使用
$ 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上创build可读的文件名。
注意:每个人都必须重新克隆新的存储库! 改变历史的任何部分都不可避免地改变了所有的变更集哈希。 所以为了解决这个问题,你也需要
要么
无论哪种方式工作,因为转换是确定性的,所以你的用户可以自己运行,如果他们有Python可用。 如果他们只安装了TortoiseHg,那么在服务器上转换它们可能是最简单的。
我考虑直接对这个转换扩展进行支持,并且已经向Mercurial邮件列表发送了一个补丁,以获得更直接的支持。
我有同样的问题。 我需要转换一堆存储库,所以我写了一个脚本,将所有的存储库转换为列表。
用法:
hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]]
你可以从我的仓库获取BitBucket。
只是从Mercurial维基 FYI提取
以下内容被明确视为未知编码中的二进制数据:
- 文件内容
- 文件名称
这些项目应被视为二进制数据,并尽可能保持无损。
因此,我想,只是在encoding =改变表示字符集可能会做的很厚
如果这个假设是错误的(它总是可能的),请尝试FixUtf8扩展 ,请阅读部分从自述文件中修复现有的文件名