Mercurial中的文件名不区分大小写处理方式

5

我正在使用TortoiseHg 0.5(包含Mercurial 1.0.2)在Vista64上。根据Mercurial Book,在不区分大小写的文件系统(如NTFS,我的操作系统所在的文件系统)上,Mercurial应该以不区分大小写的方式处理文件名。然而,我发现我的Mercurial安装实际上对大小写敏感:

>hg status -A foo
C foo
>hg status -A FOO
? FOO

这可能是Mercurial的一个bug,或者是Mercurial TortoiseHg版本的一个bug,或者是其他原因导致的。在Windows上如何实现对文件名大小写不敏感的处理呢?

2个回答

10

这个问题已经在Mercurial 1.1中得到解决!从发布说明中可以看到:“在面对大小写折叠文件系统时,提高了正确性。”

在Windows上,Mercurial现在会忽略其命令行参数的大小写:

>hg status -A foo
C foo
>hg status -A FOO
C foo

它还知道仅涉及大小写的文件名更改不会创建新文件:

>ren foo FOO
>hg status -A fOO
C foo

因此,再也不会因为在命令行上打错字而忽略更改的风险了。

但请注意, .hgignore 文件的内容仍然区分大小写。 这只在使用通配符语法时才是一个问题;使用正则表达式语法时,您可以在模式开头放置 (?i) 来使其不区分大小写。


7
我认为你误读了hgbook。第7.7节的介绍只是描述操作系统中存在的三种不同的大小写敏感类型,而不是说mercurial将反映这些语义。
在第7.7.2节“检测大小写冲突”中,它说:
当在工作目录中操作时,Mercurial遵循工作目录所在文件系统的命名策略。如果文件系统是大小写保留但不区分大小写的,则Mercurial将把仅在大小写上不同的名称视为相同。
当您执行hg status -A FOO时,在mercurial中发生的过程是:
1. 检查是否存在与文件参数“FOO”匹配的文件--此时它是大小写不敏感的,因此它找到“foo”并说“是的,我有一个文件”; 2. 检查文件清单中是否存在与文件参数“FOO”匹配的条目,但没有,因此状态显示一个“?”表示它是磁盘上未跟踪的文件。
为了更好地看到mercurial对NTFS不关心大小写,请尝试以下步骤:
1. hg init; 2. echo line > Foo; 3. hg add Foo; 4. hg commit -m 'committed Foo'; 5. move Foo not-foo; 6. move not-foo FOO; 7. hg status。
您应该看到hg说没有任何变化,因为唯一发生变化的是大小写,而hg正在为您忽略它。
当我在Linux上做同样的事情时,我看到的是:
! Foo
? FOO

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