【问题标题】:Case-insensitive filename handling in MercurialMercurial 中不区分大小写的文件名处理
【发布时间】:2008-10-26 20:59:20
【问题描述】:
我在 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 实现不区分大小写的文件名处理?
【问题讨论】:
标签:
windows
mercurial
tortoisehg
【解决方案1】:
此问题已在 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 语法时才会出现此问题;使用正则表达式语法,您可以将 (?i) 放在模式的开头以使其不敏感。
【解决方案2】:
我认为你误读了 hgbook。 7.7 节的介绍只是描述了操作系统中存在的三种不同类型的区分大小写,并不是说 mercurial 会反映这些语义。
稍后在第 7.7.2 节“检测案例冲突”中说:
在工作中操作时
目录,水星荣誉
文件系统的命名策略
工作目录位于。如果
文件系统是保留大小写的,但是
麻木不仁,Mercurial 会处理
仅在大小写上有所不同的名称
一样。
当您执行hg status -A FOO 时,mercurial 中发生的过程是:
- 检查文件系统上是否存在与文件参数“FOO”匹配的文件,此时它不区分大小写,因此它会找到“foo”并说“是的,我有一个文件”
- 检查文件清单中是否有与文件参数“FOO”匹配的条目,但没有,因此状态显示为“?”说这是 hg 未跟踪的磁盘上的文件
为了更好地了解 mercurial 不关心 NTFS 上的大小写,请尝试以下步骤:
- hg 初始化
- 回声线> Foo
- hg 添加 Foo
- hg commit -m 'committed Foo'
- move Foo not-foo
- move not-foo FOO
- 汞状态
你应该看到 hg 说什么都没有改变,因为唯一改变的是 hg 忽略了你的情况。
当我在 linux 上做同样的事情时,我看到的是:
! Foo
? FOO