Обработка имен файлов без учета регистра в Mercurial

StackOverflow https://stackoverflow.com/questions/238608

  •  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, заключается в следующем:

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

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

  1. инициализация hg
  2. строка эха > Foo
  3. hg добавить Foo
  4. hg commit -m 'зафиксированный Foo'
  5. двигайся Фу-не-фу
  6. не двигайся-фу-ФУ
  7. уровень ртути

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

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

! Foo
? FOO
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top