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

我在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构build中的一个错误,还是其他的东西? 我如何在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语法的情况下,这是一个问题; 使用正则表达式语法,您可以将(?i)放在模式的开头,使其不敏感。

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

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

在工作目录中操作时,Mercurial会遵守工作目录所在文件系统的命名策略。 如果文件系统是保留大小写的,但不敏感,那么Mercurial会将仅在大小写不同的名称视为相同。

当你做hg status -A FOO在mercurial内发生的过程是:

  1. 检查文件系统上是否存在与文件参数“FOO”匹配的文件,此时它不区分大小写,因此找到“foo”并且说“yup,我有一个文件”
  2. 检查文件清单中是否有与文件参数“FOO”匹配的条目,并且没有,所以状态显示“?” 说这是一个磁盘上的文件,不是跟踪

为了更好地看到mercurial不关心NTFS上的情况,请尝试以下步骤:

  1. hg init
  2. 回声线> Foo
  3. hg加Foo
  4. hg提交-m'提交Foo'
  5. 移动Foo非富
  6. 移动不 – 富FOO
  7. hg状态

你应该看到hg说没有什么改变,因为唯一改变的就是hg为你忽略的情况。

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

 ! Foo ? FOO