Обработка имен файлов без учета регистра в Mercurial
-
04-07-2019 - |
Вопрос
Я использую TortoiseHg 0.5 (который включает Mercurial 1.0.2) на Vista64.Мое понимание из Переменчивая Книга заключается в том, что Mercurial должен обрабатывать имена файлов без учета регистра в файловой системе без учета регистра (например, NTFS, в которой я работаю).Однако я нахожу, что моя установка Mercurial на самом деле чувствительна к регистру:
>hg status -A foo
C foo
>hg status -A FOO
? FOO
Может ли это быть ошибкой в Mercurial, ошибкой в сборке TortoiseHg Mercurial, или это что-то еще?Как я могу добиться нечувствительной к регистру обработки имени файла с помощью Mercurial в Windows?
Решение
Эта проблема была решена в 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) в начале шаблонов, чтобы сделать их нечувствительными.
Другие советы
Я думаю, вы неправильно прочитали hgbook.Введение к разделу 7.7 просто описывает три различных типа чувствительности к регистру, которые существуют в OSS, не говоря о том, что mercurial будет отражать эту семантику.
Позже, в разделе 7.7.2 "Обнаружение конфликтов обращений", говорится:
При работе в рабочем каталоге Mercurial соблюдает политику именования файловой системы, в которой расположен рабочий каталог.Если файловая система сохраняет регистр, но нечувствительна, Mercurial обработает имена, которые отличаются только регистром, как одинаковые.
Когда ты это сделаешь hg status -A FOO
процесс, который происходит внутри mercurial, заключается в следующем:
- Проверьте, существует ли в файловой системе файл, соответствующий аргументу file 'FOO', - и на данный момент он не чувствителен к регистру, поэтому находит 'foo' и говорит "ага, у меня есть файл".
- Проверьте, есть ли в файловом манифесте запись, соответствующая аргументу file, 'FOO', но ее нет, поэтому статус показывает '?', что это файл на диске, который hg не отслеживает
Чтобы лучше видеть, что mercurial не заботится о регистре в NTFS, попробуйте выполнить следующие действия:
- инициализация hg
- строка эха > Foo
- hg добавить Foo
- hg commit -m 'зафиксированный Foo'
- двигайся Фу-не-фу
- не двигайся-фу-ФУ
- уровень ртути
и вы должны увидеть, как hg говорит, что ничего не изменилось, потому что единственное, что изменилось, - это случай, который hg игнорирует для вас.
Когда я делаю то же самое в linux, я вместо этого вижу:
! Foo
? FOO