Mercurial转换文件名编码


12

我有使用mod_wsgi在Apache上运行的Mercurial存储库。存储库的所有文件名都在Windows-1251中编码。使用此编码是出于历史原因:它们是从svn转换为汞,windows-1251是俄语区域设置的默认Windows编码。

现在,程序员希望使用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

1
俄语文件名?不考虑文件重命名?
Lazy Badger,

1
我是系统管理员,而不是开发人员,我的职责是提供稳定的工作服务,而不是学习如何使用它。
Selivanov Pavel

Matt Mackall 很久以前写的,也许已经过时了#如果您想使用UTF-8而不是默认的#语言环境字符集来提供页面,则可以通过取消注释以下几行来实现。#请注意,这将导致您的.hgrc文件在#UTF-8中进行解释,并且所有回购文件都将使用UTF-8显示。##import os#os.environ [“ HGENCODING”] =“ UTF-8”
Lazy Badger

我在以下答案中写了评论:更改encoding = windows-1251encoding = UTF-8仅使文件名不可读。这是因为它们存储在Windows-1251中。“ UTF-8” os.environ [“ HGENCODING”] =“ UTF-8”等于此设置。
Selivanov Pavel

Answers:


6

没错,convert扩展目前不支持此功能。也就是说,你不能把它从编码要求重新编写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扩展必须被用来制造水银转换UTF-8的文件名到上飞UTF-16。这也会在Windows上创建可读的文件名。

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

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

要么

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

由于转换是确定性的,因此这两种方法均有效,因此如果用户拥有Python,则您可以自己运行它。如果他们仅安装了TortoiseHg,则在服务器上进行转换可能最简单。

我希望使convert扩展更直接地对此提供支持,并已将补丁程序发送到Mercurial邮件列表中,以对此提供更直接的支持。


我已经在邮件列表上发布了完整补丁
马丁·盖斯勒

坩埚传教士离开了我们公司,因此问题消失了。非常感谢您编写代码来解决我的问题并改善了质量:)当我有空的时候我会尝试一下。
Selivanov Pavel

嗯,问题解决了:-)试用后,请随时接受我的回答。
马丁·盖斯勒

没有汞-体现在水银1.8中。我已经使用过hg --manifest -r小技巧。一切都可以在Linux机器上正常运行:在hgweb.config中,我在回购中看到正确的文件名,编码为= UTF-8,在克隆的存储库中文件名正确。在Windows机器上,克隆后我得到了“ РџРsяяснительннѰзапискк.docx”文件名。
Selivanov Pavel

是的,这是可以预期的—当您克隆到Windows时,文件名不会被重新编码,因此您的签出将变成垃圾。现在使用FixUtf8扩展。
Martin Geisler

2

我有同样的问题。我需要转换一堆存储库,所以我写了一个脚本来转换所有以列表形式给出的存储库。

用法:

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

您可以从的BitBucket 存储库中获取。


0

只需从Mercurial Wiki FYI中提取

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

  • 文件内容
  • 文件名

这些项目应视为二进制数据,并在可能的情况下无损保留。

因此,我想,只要更改演示字符集就encoding =可以

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


更改encoding = windows-1251encoding = UTF-8仅使文件名不可读。FixUtf8也无济于事。
Selivanov Pavel

好。尝试返回编码= Windows-1251,然后尝试AddDefaultCharset utf-8使用Apache。另一个想法-将WAMP更改为以UTF8为区域设置的LAMP,并且不处理文件名,而是encoding = UTF-8再次执行
Lazy Badger,

LAMP。过去,存储库是通过Subversion放在WAMP上的,后来我将其转换为Mercurial,并以UTF-8语言环境迁移到Linux计算机上。encoding = windows-1251已设置,因为数据已经采用此编码。
Selivanov Pavel

重新阅读维基!1251只是表示层,而不是存储层
Lazy Badger

被以未知编码显式地视为二进制数据,并且此编码为Windows-1251,文件名存储在其中。我需要某种方式将其转换为UTF-8
Selivanov Pavel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.