5

我在 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 实现不区分大小写的文件名处理?

4

2 回答 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 文件的内容仍然区分大小写。仅当您使用 glob 语法时才会出现此问题;使用正则表达式语法,您可以将 (?i) 放在模式的开头以使其不敏感。

于 2009-02-09T20:16:30.540 回答
7

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

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

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

当您执行hg status -A FOOmercurial 中发生的过程时:

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

为了更好地查看 mercurial 不关心 NTFS 上的大小写,请尝试以下步骤:

  1. 汞初始化
  2. 回声线 > Foo
  3. hg 添加 Foo
  4. hg commit -m '提交的 Foo'
  5. move Foo not-foo
  6. move not-foo FOO
  7. 汞状况

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

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

! Foo
? FOO
于 2008-10-29T05:16:14.040 回答