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

时间:2008-10-26 20:59:20

标签: windows mercurial tortoisehg

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

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

这可能是Mercurial中的一个错误,这是Mercurial的TortoiseHg构建中的一个错误,还是别的什么?如何从Windows上的Mercurial实现不区分大小写的文件名处理?

2 个答案:

答案 0 :(得分:10)

此问题已在Mercurial 1.1中得到解决!从release notes:“改进了案例折叠文件系统的正确性”。

在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)放在模式的开头,使它们不敏感。

答案 1 :(得分:7)

我认为你误读了hgbook。第7.7节的介绍只是描述操作系统中存在的三种不同类型的区分大小写,而不是说mercurial将反映这些语义。

稍后在第7.7.2节“检测案件冲突”中,它说:

  

在工作中操作   目录,Mercurial表示敬意   命名文件系统的策略在哪里   工作目录所在。如果   文件系统是保留大小写的,但是   不敏感,Mercurial会对待   只有在作为的情况下才有区别的名称   相同。

执行hg status -A FOO时,mercurial中发生的过程是:

  1. 检查文件系统上是否存在与文件参数'FOO'匹配的文件,此时它不区分大小写,因此它找到'foo'并说“是的,我有一个文件”< / LI>
  2. 检查文件清单中是否有与文件参数“FOO”匹配的条目,但没有,因此状态显示“?”说它是磁盘上的文件,hg没有跟踪
  3. 为了更好地看到mercurial不关心NTFS上的案例,请尝试以下步骤:

    1. hg init
    2. 回声线&gt;富
    3. hg add Foo
    4. hg commit -m'委托Foo'
    5. 移动Foo not-foo
    6. 移动not-foo FOO
    7. hg status
    8. 你应该看到hg说没有任何改变,因为唯一改变的是hg忽略的情况。

      当我在linux上做同样的事情时,我会看到:

      ! Foo
      ? FOO