Mercurial转换文件名编码

我使用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可读的文件名。

    注意:每个人都必须重新克隆新的存储库! 改变历史的任何部分都不可避免地改变了所有的变更集哈希。 所以为了解决这个问题,你也需要

    1. 使大家推送到服务器,
    2. 转换服务器上的存储库,
    3. 有人重新克隆

    要么

    1. 让每个人在本地仓库上运行上述命令
    2. 转换服务器上的存储库

    无论哪种方式工作,因为转换是确定性的,所以你的用户可以自己运行,如果他们有Python可用。 如果他们只安装了TortoiseHg,那么在服务器上转换它们可能是最简单的。

    我考虑直接对这个转换扩展进行支持,并且已经向Mercurial邮件列表发送了一个补丁,以获得更直接的支持。

    我有同样的问题。 我需要转换一堆存储库,所以我写了一个脚本,将所有的存储库转换为列表。

    用法:

     hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]] 

    你可以从我的仓库获取BitBucket。

    只是从Mercurial维基 FYI提取

    以下内容被明确视为未知编码中的二进制数据:

    • 文件内容
    • 文件名称

    这些项目应被视为二进制数据,并尽可能保持无损。

    因此,我想,只是在encoding =改变表示字符集可能会做的很厚

    如果这个假设是错误的(它总是可能的),请尝试FixUtf8扩展 ,请阅读部分从自述文件中修复现有的文件名