English 中文(简体)
Mercurial 中不区分大小写的文件名处理
原标题:
  • 时间:2008-10-26 20:59:20
  •  标签:

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

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

这可能是Mercurial中的一个错误、Mercurial的TortoiseHg版中的一个错误,还是其他什么问题?我如何在Windows上从Mercurial实现不区分大小写的文件名处理?

最佳回答

这个问题已经在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 文件的内容仍然区分大小写。只有在使用 glob 语法时才会引起问题;使用 regexp 语法,您可以在模式的开头放置 (?i) 使其大小写不敏感。

问题回答

我认为你误读了hgbook。第7.7节的介绍只是描述了操作系统中存在的三种不同的大小写敏感性类型,并不是在说Mercurial会反映这些语义。

后来在第7.7.2节中,检测案例冲突它说:

When operating in the working directory, Mercurial honours the naming policy of the filesystem where the working directory is located. If the filesystem is case preserving, but insensitive, Mercurial will treat names that differ only in case as the same.

当你执行 hg status -A FOO 的时候,mercurial 内部会进行以下过程:

  1. Check if a file exists on the file system matching the file argument, FOO , -- and at this point it s being case insensitive so it finds foo and says "yup, I ve got a file"
  2. Check if there s an entry in the file manifest matching the file argument, FOO , and there isn t, so status shows a ? saying it s a file on disk that hg isn t tracking

为了更好地看到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




相关问题
热门标签