Mercurial 转换文件名编码

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)

Mar*_*ler 6

您是对的,转换扩展目前不以一种很好的方式支持这一点。也就是说,您不能要求它从编码X重新编码为编码Y。但是,您可以要求它为您一一重命名文件!首先创建一个名为rename.pywith的文件

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

注意:每个人都必须重新克隆新的存储库!更改历史的任何部分不可避免地也会更改所有变更集哈希。所以要做到这一点,你需要要么

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

或者

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

无论哪种方式都有效,因为转换是确定性的,因此您的用户可以在有 Python 可用的情况下自己运行它。如果他们只有 TortoiseHg 安装,那么在服务器上为他们进行转换可能是最简单的。

我着眼于让 convert 扩展更直接地支持这一点,并向 Mercurial 邮件列表发送了一个补丁,以获得更直接的支持。


Laz*_*ger 0

仅从Mercurial Wiki中提取仅供参考

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

  • 文件内容
  • 文件名

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

因此,我想,仅仅改变演示文稿字符集encoding =就可以做到这一点

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