Как определить hg игнорировать исключения?

gitignore имеет возможность определить игнорировать исключение с помощью необязательного префикса ! например, чтобы не игнорировать конкретный файл foo.dll:

*.dll        # Exclude all dlls
!foo.dll     # Except for foo.dll 

Как мы можем определить такие исключения в hgignore?

1 ответ

Mercurial позволяет исключениям кодировать шаблоны только в том же правиле, которое определяет шаблон игнорирования (обычно через (?!...), (?<!...) или аналогичные конструкции регулярных выражений), даже если его механизм сопоставления значительно более мощный (и может в принципе соответствовать размеру файла и другим параметрам, указанным в hg help filesets).

Это имеет две причины, сочетаемость и производительность.

компонуемости

Если у вас есть система включения / исключения для шаблонов, то порядок имеет значение. Mercurial имеет различные источники для игнорирования файлов: .hgignore файл в хранилище, а также любой ui.ignore а также ui.ignore.* вариант в hgrc файл, который обрабатывает Mercurial, и каждый файл, включенный include: Директива из приведенного выше списка. Разрешение правилам взаимодействовать друг с другом через различные файлы игнорирования неожиданным образом может привести к неожиданным ситуациям, которые трудно отладить. В качестве альтернативы, один тип шаблона (включение или исключение) может быть приоритетным по сравнению с другими, но это создает свои собственные проблемы.

Спектакль

Mercurial использует файлы игнорирования для сокращения прогулок по дереву каталогов. Если каталог соответствует правилу игнорирования, он пропускается полностью (например, выходной каталог сборки с тысячами временных файлов). Если у вас есть шаблон игнорирования, соответствующий каталогу, но также и исключение, соответствующее файлу в каталоге, вы можете либо не обрезать обход каталога, либо игнорировать исключение для каталога (Git решает сделать последнее). Отключение обхода каталога неэффективно, игнорирование исключений внутри каталога серьезно ограничивает число вариантов использования, которые еще не обрабатываются регулярно регулярными выражениями.

Решение и обходные пути

Основное различие между Mercurial и Git заключается в том, что Mercurial предоставляет возможность использовать расширенные регулярные выражения Python в дополнение к шаблонам glob (Git использует только шаблоны glob). Регулярные выражения исключают необходимость исключений для большинства (но не для всех) вариантов использования.

Эти случаи обычно обрабатываются адекватно через re:(?!exception)pattern линия в вашем .hgignore файл (и в некоторых случаях другие расширенные шаблоны регулярных выражений). Обратите внимание, что (?x) Мета-шаблон, который игнорирует неэкранированные пробелы и комментарии в регулярном выражении, может быть полезен для того, чтобы сделать сложные выражения более читабельными. Например, следующие два эквивалента:

re:(?x) (^|/) (?!foobar) foo # do not ignore files starting with `foobar`.
re:(^|/)(?!foobar)foo

Это работает достаточно хорошо для игнорирования файлов, поскольку шаблоны файлов редко содержат пробельные символы или хеш-символы. Также обратите внимание, что вы можете переключаться на синтаксис регулярных выражений построчно, добавляя к нему префикс re: или же regexp:, даже если вы обычно используете syntax: glob,

Если этого недостаточно, возможно изменить существующее поведение с помощью расширений, если никакая другая опция не применяется. Вы можете переопределить mercurial.dirstate.dirstate.{_ignore,_dirignore} или вы можете автоматически добавить -I/-X варианты соответствующих команд на основе (скажем) .hginclexcl файл.

Другие вопросы по тегам