簡體   English   中英

Mercurial中不區分大小寫的文件名處理

[英]Case-insensitive filename handling in 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構建中的一個錯誤,還是別的什么? 如何從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語法時才會出現問題。 使用regexp語法,您可以將(?i)放在模式的開頭,使它們不敏感。

我覺得你誤讀了hgbook。 第7.7節的介紹只是描述操作系統中存在的三種不同類型的區分大小寫,而不是說mercurial將反映這些語義。

后來在第7.7.2節“檢測案件沖突”中,它說:

在工作目錄中操作時,Mercurial遵循工作目錄所在的文件系統的命名策略。 如果文件系統保留大小寫但不敏感,Mercurial會將僅在大小寫不同的名稱視為相同。

當你做hg status -A FOO ,mercurial中發生的過程是:

  1. 檢查文件系統上是否存在與文件參數'FOO'匹配的文件,此時它是不區分大小寫的,因此它找到'foo'並說“是的,我有一個文件”
  2. 檢查文件清單中是否有與文件參數“FOO”匹配的條目,並且沒有,因此狀態顯示“?” 說它是磁盤上的文件,hg沒有跟蹤

為了更好地看到mercurial不關心NTFS上的案例,請嘗試以下步驟:

  1. hg init
  2. 回聲線> Foo
  3. hg添加Foo
  4. hg commit -m'委托Foo'
  5. 移動Foo not-foo
  6. 移動not-foo FOO
  7. hg狀態

你應該看到hg說沒有任何改變,因為唯一改變的是hg忽略你的情況。

當我在linux上做同樣的事情時,我會看到:

! Foo
? FOO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM