Mercurial 转换文件名编码

Mercurial 转换文件名编码

我有在 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 上创建可读的文件名。

笔记:每个人都必须重新克隆新的存储库!更改历史记录的任何部分都不可避免地会更改所有变更集哈希值。因此,要实现这一点,您需要

  1. 让每个人都推送到服务器,
  2. 转换服务器上的存储库,
  3. 让人们重新克隆

或者

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

两种方法都可以,因为转换是确定性的,因此如果您的用户有 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 扩展,仔细阅读自述文件中的修复现有文件名部分

相关内容