我有在 Apache 上运行的 Mercurial 存储库,带有 mod_wsgi。存储库的所有文件名都以 windows-1251 编码。出于历史原因,使用此编码:它们从 svn 转换为 mercurial,windows-1251 是俄语语言环境的默认 windows 编码。
现在程序员想要使用坩代码审查工具。它无法理解除 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
答案1
您说得对,转换扩展目前无法很好地支持这一点。也就是说,您无法要求它从编码中重新编码X编码是。不过,你可以要求它逐个重命名文件!首先创建一个名为的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
这将创建你的文件映射。现在你可以使用
$ 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 上创建可读的文件名。
笔记:每个人都必须重新克隆新的存储库!更改历史记录的任何部分都不可避免地会更改所有变更集哈希值。因此,要实现这一点,您需要
- 让每个人都推送到服务器,
- 转换服务器上的存储库,
- 让人们重新克隆
或者
- 让每个人都在本地存储库上运行上述命令
- 转换服务器上的存储库
两种方法都可以,因为转换是确定性的,因此如果您的用户有 Python,他们可以自己运行它。如果他们只安装了 TortoiseHg,那么最简单的方法可能是在您的服务器上为他们进行转换。
我考虑让转换扩展更直接地支持这一点,已将补丁发送至 Mercurial 邮件列表以获得更直接的支持。
答案2
我遇到了同样的问题。我需要转换一堆存储库,因此我编写了一个脚本来转换列表中给出的所有存储库。
用法:
hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]]
您可以从我的存储库在 BitBucket。
答案3
只需提取Mercurial 维基供参考
以下内容被明确视为未知编码的二进制数据:
- 文件内容
- 文件名
这些项目应被视为二进制数据并尽可能无损地保存。
因此,我认为,只需改变表示字符集encoding =
就可以解决
如果这个假设是错误的(总是有可能的),请尝试FixUtf8 扩展,仔细阅读自述文件中的修复现有文件名部分