Sel*_*vel 12 mercurial encoding crucible
我有使用 mod_wsgi 在 Apache 上运行的 Mercurial 存储库。存储库的所有文件名都以 windows-1251 编码。这种编码用于历史原因:它们从 svn 转换为 mercurial,windows-1251 是俄罗斯语言环境的默认 windows 编码。
现在程序员想要使用Crucible工具进行代码审查。它不能用除 utf-8 以外的任何其他编码对文件名进行undersand。所以我需要将它们从 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
Run Code Online (Sandbox Code Playgroud)
您是对的,转换扩展目前不以一种很好的方式支持这一点。也就是说,您不能要求它从编码X重新编码为编码Y。但是,您可以要求它为您一一重命名文件!首先创建一个名为rename.py
with的文件
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)
Run Code Online (Sandbox Code Playgroud)
然后运行
$ hg manifest --all | python rename.py > rename.txt
Run Code Online (Sandbox Code Playgroud)
这将创建您的文件映射。您现在可以使用
$ hg convert --filemap rename.txt cp1251-repo utf-8-repo
Run Code Online (Sandbox Code Playgroud)
将存储库转换为新的存储库。在新存储库中,看起来文件始终使用 UTF-8 文件名保存。
注意:文件名现在以 UTF-8 格式存储在存储库中。这意味着结帐在现代 Linux 机器上看起来不错。但是,Windows 不使用 UTF-8 文件名。该FixUtf-8扩展必须被用来制造水银转换UTF-8的文件名到上飞UTF-16。这也将在 Windows 上创建可读的文件名。
注意:每个人都必须重新克隆新的存储库!更改历史的任何部分不可避免地也会更改所有变更集哈希。所以要做到这一点,你需要要么
或者
无论哪种方式都有效,因为转换是确定性的,因此您的用户可以在有 Python 可用的情况下自己运行它。如果他们只有 TortoiseHg 安装,那么在服务器上为他们进行转换可能是最简单的。
我着眼于让 convert 扩展更直接地支持这一点,并向 Mercurial 邮件列表发送了一个补丁,以获得更直接的支持。
仅从Mercurial Wiki中提取仅供参考
以下内容被明确视为未知编码的二进制数据:
- 文件内容
- 文件名
这些项目应被视为二进制数据并尽可能无损地保存。
因此,我想,仅仅改变演示文稿字符集encoding =
就可以做到这一点
如果这个假设是错误的(总是有可能),请尝试FixUtf8 Extension,仔细阅读自述文件中的修复现有文件名部分