【问题标题】: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 中发生的过程是:

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

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

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

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

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

      ! Foo
      ? FOO
      

      【讨论】:

        猜你喜欢
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 2018-04-30
        • 2011-09-12
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多