Чтобы немного подправить вопрос, чтобы прояснить его (по крайней мере, для меня), у нас есть любое количество имен /bin/somename/...
и .../bin/anothername/...
, которые следует игнорировать, а также три набора .../bin/folder1/...
, .../bin/2folder/...
и .../Bin/third/...
набор имен, которые следует игнорировать , а не .
Следовательно, нам нужно регулярное выражение, которое (без привязки) будет соответствовать именам toбыть проигнорированным, но не теми, кого нужно сохранить.(Более того, сопоставление глобусов не будет работать, поскольку оно не столь мощное: мы сопоставим либо слишком мало, либо слишком много, а в Mercurial отсутствует функция «переопределить с последующим игнорированием» в Git.)
Самое короткое регулярное выражение для этого должно быть:
/[Bb]in/(?!(folder1|2folder|third)/)
(Часть этого регулярного выражения, которая на самом деле соответствует строке типа /bin/somename/...
, является только частью /bin/
, но Mercurial не смотрит на что соответствует, только соответствует ли что-то соответствует.)
Дело в том, что ваш пример регулярного выражения должен работать, это просто более длинный вариант этой же вещис необязательным, но безвредным (кроме производительности) .*
, добавленным спереди и сзади.Так что, если у вас не работает, выше, вероятно, не будет работать.Образец репозитория с некоторыми фиктивными файлами, с которыми можно клонировать и экспериментировать, поможет диагностировать проблему.
Оригинальный (неправильный) ответ (на вопрос, который не является вопросом)
Самое короткое регулярное выражение для нужного случая:
/[Bb]in/Folder[123]/
Однако, если имена каталогов / папок не соответствуют этому шаблону, нам нужно:
/[Bb]in/(somedir|another|third)/
Объяснение
Во-первых, примечание: по умолчанию используется синтаксис regexp, поэтому в начальной строке syntax: regexp
нет необходимости.В результате возможно, что ваш .hgignore
файл не в правильном формате UTF-8: см. Mercurial выдает ошибку «недопустимый шаблон» для простого синтаксиса GLOB .(Но это может привести к другому поведению, так что это, вероятно, проблема. Стоит упомянуть в любом ответе о .hgignore
сбоях в работе файлов.)
Далее стоит отметить несколько пунктов:
Mercurial отслеживает только файлы, но не каталоги / папки.Таким образом, реальный вопрос заключается в том, соответствует ли любое имя файла шаблону (ам), перечисленным в .hgignore
.Если они совпадают, и файл в настоящее время не отслежен , файл не будет автоматически добавлен с помощью операции «добавить все», и Mercurial не заметит, что файл не отслежен.
Если какой-либо файл уже отслежен, тот факт, что его имя соответствует шаблону игнорирования, не имеет значения.Если файл a/b/c.ext
не отслеживается и соответствует шаблону, hg add a/b/c.ext
все равно добавит его, в то время как hg add a/b
массово добавит все в a/b
, но не будет добавить c.ext
, потому что это соответствует шаблону.Поэтому важно знать, отслеживается ли файл, и учитывать то, что вы явно перечислили в hg add
.См. Также Как проверить, какие файлы игнорируются из-за .hgignore? , например.
Шаблоны глобусов намного легче писатьправильно, чем регулярные выражения.Если вы не делаете это для целей обучения или преподавания, или шар не достаточно мощный, придерживайтесь паттернов глобуса.(В очень старых версиях Mercurial сопоставление глобуса было заметно медленнее, чем сопоставление с регулярным выражением, но это было исправлено в течение длительного времени.)
Записи игнорирования регулярного выражения Mercurial не привязываются автоматически: если вычтобы закрепить поведение, используйте ^
спереди и $
в конце по желанию.Здесь вы не не хотите привязанного поведения, так что вы можете устранить ведущий и конечный .*
.(Mercurial относится к этому как с корнем , а не с привязкой , и важно отметить, что некоторые шаблоны привязаны , но .hgignore
- нет.)
Синтаксис регулярного выражения Python / Perl (?!...)
является синтаксисом отрицания : (?!...)
соответствует, если заключенное в скобки выражение не соответствует строке.Это часть проблемы.
Нам не нужно беспокоиться о захвате групп (см. захват группы в регулярном выражении ), поскольку Mercurial ничего не делает с группами, которые выходят изрегулярное выражение.Это только заботится, если мы сопоставляем.
Имена путей действительно разделены косой чертой компонентов .Ведущими компонентами являются различные каталоги (папки) над именем файла, а последним компонентом является имя файла.(То есть, постарайтесь не думать о первых частях как о папках : это не так, что это неправильно, а в том, что оно менее общее, чем "компоненты", поскольку последняя часть также является компонентом.)
В данном случае мы хотим сопоставить и, следовательно, «игнорировать» имена, в которых один компонент соответствует либо bin
, либо Bin
, за которым сразу следует другой компонент, соответствующий Folder1
, Folder2
или Folder3
, за которым следует компонент-разделитель (например, мы не остановились на /bin/Folder1
, например, file named Folder1
в каталоге /bin
).
Строки bin
и Bin
оба заканчиваются общей завершающей частью in
, поэтому он распознается как (B|b)in
, но одинарныйЧередование символов-символов легче выражать в виде класса символов: [Bb]
, что устраняет необходимость в скобках и вертикальных чертах.
То же самое относится к именам Folder1
, Folder2
и Folder3
за исключением того, что их общая строка ведет, а не тянется, поэтому мыможно использовать Folder[123]
.
Предположим, у нас были привязанные совпадения.То есть, предположим, что Mercurial потребовал, чтобы мы сопоставили целое имя файла, которое может быть, скажем, /foo/hello/bin/Folder2/bar/world.ext
. Тогда нам понадобится .*/[Bb]in/Folder[123]/.*
, потому что нам нужно сопоставить любое количество символов, чтобы пропустить /foo/hello
перед совпадением /bin/Folder2/
, и снова пропустить любое количество символов, чтобы соответствовать bar/world.ext
, чтобы соответствовать всей строке.Но поскольку у нас нет привязанных совпадений, мы найдем шаблон /bin/Folder2/
во всей строке и, следовательно, проигнорируем этот файл, используя более простой шаблон без начального и конечного .*
.