Независимая от регистра обработка имени файла в Mercurial - PullRequest
5 голосов
/ 26 октября 2008

Я использую TortoiseHg 0.5 (включая Mercurial 1.0.2) на Vista64. Насколько я понимаю из Mercurial Book , Mercurial должен обрабатывать имена файлов без учета регистра в файловой системе без учета регистра (такой как NTFS, на которой я и работаю). Однако я считаю, что моя установка Mercurial чувствительна к регистру:

>hg status -A foo
C foo
>hg status -A FOO
? FOO

Может ли это быть ошибкой в ​​Mercurial, ошибкой в ​​сборке TorcuiseHg Mercurial или это что-то еще? Как я могу добиться обработки имени файла без учета регистра в Mercurial для Windows?

Ответы [ 2 ]

10 голосов
/ 09 февраля 2009

Эта проблема была решена в 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) в начале шаблонов, чтобы сделать их нечувствительными.

7 голосов
/ 29 октября 2008

Я думаю, что вы неправильно прочитали hgbook. Вступление к разделу 7.7 просто описывает три различных типа чувствительности к регистру, которые существуют в ОС, не говоря о том, что Mercurial будет отражать эту семантику.

Позже в разделе 7.7.2 «Обнаружение конфликтов случаев» говорится:

при работе в рабочем справочник, Mercurial чтит политика именования файловой системы, где рабочий каталог находится. Если файловая система сохраняет регистр, но нечувствительный, Mercurial будет лечить имена, которые отличаются только в том случае, если то же самое.

Когда вы делаете hg status -A FOO процесс, который происходит в Mercurial:

  1. Проверьте, существует ли файл в файловой системе, совпадающий с аргументом файла 'FOO', - и в этот момент он нечувствителен к регистру, поэтому он находит 'foo' и говорит: «У меня есть файл»
  2. Проверьте, есть ли в манифесте файла запись, соответствующая аргументу файла 'FOO', и ее нет, поэтому статус показывает '?' говоря, что это файл на диске, который hg не отслеживает

Чтобы лучше увидеть, что Mercurial не заботится о случае в NTFS, попробуйте выполнить следующие действия:

  1. рт.ст. init
  2. эхо-линия> Foo
  3. рт.ст. добавить Foo
  4. hg commit -m 'commit Foo'
  5. переместить Фу не-фу
  6. двигаться не-фу FOO
  7. статус ртутного столба

и вы должны увидеть, что hg говорит, что ничего не изменилось, потому что единственное, что изменилось, это случай, который hg игнорирует для вас.

Когда я делаю то же самое в Linux, я вместо этого вижу:

! Foo
? FOO
...