哪些分布式版本控制系统支持Unicode文件名?

23

我有兴趣尝试分布式版本控制系统。Git听起来很有前途,但我在某个地方看到了一个关于Git Windows端的注释,说“不要使用非ASCII文件名”。我现在找不到那个注释了,但是有这个链接。这让我暂时放弃了Git,但我不知道其他选项是否更好。

对于我们日本公司来说,支持非ASCII文件名至关重要。我正在寻找一种内部将文件名存储为Unicode而不是平台相关编码的DVCS,这将导致无尽的烦恼。所以:

  1. 哪些DVCS支持Unicode文件名?
  2. 在Windows和Linux上都支持吗?
  3. 理想情况下,是否可以在Windows和Linux机器之间传输仓库并最小化问题?

msysgit即将支持UTF-8。请参见https://dev59.com/Ym025IYBdhLWcg3wsIIU#5855213和下面的更新答案:https://dev59.com/WnRA5IYBdhLWcg3wyBD1#1274142。 - VonC
7个回答

9
请看同一代码库中问题80。2009年,Git邮件列表上有一个讨论(例如12),Git维护者Junio Hamano在其中提出了一些问题。我这里没有它。通过以建设性的方式加入该线程,您可能会帮助解决问题。
在Java实现JGit中,我们在创建文本元数据和文件名时始终使用UTF-8。那是唯一的方法,但有一些需要考虑的事情。

8

他们的网站上有一个关于Bazaar Unicode支持的页面:http://bazaar-vcs.org/UnicodeSupport - Austin
那个页面更适合开发者查看,而不是用户文档,并且有点过时。 - bialix
2
我在Windows上对Bazaar进行了一些基本测试,并确认它可以添加和合并文件,即使它们的文件名字符超出了当前系统代码页。很不错。稍后我会在Linux上尝试该存储库,并查看它是否能够正确地分支。 - Craig McQueen
我在Windows上进一步测试了Bazaar,并发现虽然命令行工作正常,但GUI在提交具有文件名字符超出当前系统代码页的更改时失败。 - Craig McQueen
Craig,感谢您的评论。这实际上是所有基于Python的程序的问题。我已经在命令行中提交了有关当前系统代码页之外的Unicode字符的错误报告:https://bugs.launchpad.net/bzr/+bug/375934。它很快就会被修复。 - bialix
显示剩余2条评论

8

Mercurial

在Linux上,我认为Mercurial只会以系统的编码格式进行编码(如果我说错了,请纠正我)。因此最好将Linux设置为UTF-8以实现跨平台兼容性。这是许多现代发行版的默认设置。

在Windows上,Mercurial(由于Python的字节字符串处理)使用的是系统代码页。这几乎保证了非ASCII字符的跨平台互操作存在问题。

针对早期版本Mercurial的Windows fixutf8扩展(低于2.0)

有一个名为fixutf8的外部创建的Mercurial扩展,在Mercurial仓库中正确处理所有Unicode字符(甚至处理当前代码页之外的字符),并将文件名编码为UTF-8。这样,只要Linux使用UTF-8编码,就可以与Linux实现互操作性。我在上周尝试在我的Windows上启用它时,遇到了一些安装问题。自那以后,已经解决了一个问题。现在唯一的问题是二进制Mercurial分配使用Python 2.4构建,而fixutf8需要使用Python 2.5或更高版本构建Mercurial,以加载fixutf8。我希望这个问题在不久的将来会得到解决。

Mercurial 2.0及更高版本的Windows

根据fixutf8网页,fixutf8似乎与Mercurial 2.0及更高版本不兼容。有关未来解决方案的详细信息,请参见WindowsUTF8Plan。我不确定这个问题预计何时会得到解决。


4
我维护fixutf8扩展程序并且每天在二进制HG版本中使用它。如果有问题,请在 http://bitbucket.org/stefanrusek/hg-fixutf8/ 上提交错误报告,我很乐意查看。 - Stefan Rusek
最近我遇到了一个与 fixutf8 扩展有关的问题。通过使用 fixutf8 的分支版本,这个问题似乎已经得到了解决。你可以在这里找到这个分支版本:http://bitbucket.org/tinyfish/hg-fixutf8。 - Craig McQueen
1
fixutf8 无法与最新版本的 Mercurial(例如 2.5)一起使用。 - Nathan
4
因为这不再起作用,所以评分为-1。截至2012年12月,Mercurial不支持Unicode DVCS,并且由于一些奇怪的原因,他们将文件名视为“二进制块”,而不是“文本”,因此在未来几年内可能会有很差的支持(值得一提的是,这是因为Unix也将文件名视为二进制块而不是文本)。 - Roman Starkov
谢谢你告诉我。但也许Mercurial正在努力支持本地化。请参见WindowsUTF8Plan。这听起来与git处理方式相似(在Linux上工作,只要文件系统设置为UTF8;在Windows上翻译)。 - Craig McQueen
显示剩余2条评论

8

git

2009年8月:

msysgit项目正在忙于修复Windows上Git的UTF-8支持。也许在下一个版本中会解决这个问题。


2012年2月更新

UTF-8即将到来,msysgit有了像“更新UTF-8的less设置”这样的提交

来自Git for Windows Google+页面:

Karsten Blees的Git for Windows UTF-8补丁现在已经合并到'devel'分支。
这意味着即将发布的版本将支持Unicode文件名!


2012年4月更新

现在已经在mSysGit 1.7.10中发布了。

请参阅页面Git for Windows Unicode Support


Johan:如果他们修复了它,请回来更新您的帖子。我相信会有人觉得它很有用。 - quark
3
目前(截至2010年9月),尚未确定! - niels
3
截至msysgit 1.7.6版本,这个问题仍然没有被修复。:( - Ryan Lundy
2
我正在使用Git-1.7.10-preview20120409.exe,现在Unicode文件名已经被正确识别。 - anno

2

现在,Git on Windows 1.7.10不管用户的位置在哪里,都使用UTF-8编码来处理文件名。


0
根据this页面显示:Bazaar、Codendi、CVSNT、Monotone、Perforce、Rational Team Concert、Subversion、Surround SCM、Synergy。但该页面上还有很多“未知”的内容。

0

这是一个非常棘手的问题。问题在于,工具试图解释文件名时不知道确切的编码方式,或者因为翻译错误而翻译成无法处理所有情况的形式(如 ASCII 或 UTF-16)。三个主流的操作系统都没有统一文件名的编码方式,使事情变得更加困难。

为了更好地理解这些问题,建议阅读 Mercurial 的编码策略页面。它描述了各种平台的差异以及 Mercurial 选择该策略的原因。

如果您真的需要这样做,那么最基本的事情是所有系统都需要设置为使用 UTF-8 文件名,而不是众多日本代码页之一。虽然这并不容易,但一旦完成,任何系统都不需要将文件名翻译成其他任何语言。

没有翻译,没有问题。


*: 是的,我知道你可以有一个默认的系统编码,但这并不等同于文件系统编码。当文件系统被多个系统访问或在系统之间物理移动时会发生什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接