2012-05-03 8 views
0

Из огромного дерева исходных текстов я хочу, чтобы только одна подпапка была отслежена Mercurial.Weird negative lookahead handling in hgignore

specific/component/subfolder 

В любом приличном инструмент регулярных выражений (Regex Coach, regexpal.com), следующий вполне достаточно (и понятно)

^(?!specific/component/subfolder).+ 

тем временем .hgignore настаивает на

^(?!extras).+ 
^extras/(?!extensions).+ 
^extras/extensions/(?!sharing).+ 

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

Перед вызова это ошибка (возможно, еще одного доморощенного регулярного выражение парсера?) Я спрашиваю коллективный интеллект :-)

Кредита непрямого ключ на то, что хочет, чтобы щеколда hgignore пойти

Honing the .hgignore file using a negative lookahead

ответ

5

Просто не используйте отрицательные образы в .hgignore. В самом деле. Каждый раз, когда кто-то предлагает его здесь, в Stack Overflow, я звоню, давая им понять, что он не работает, потому что это не предназначенная функция. Если файл .hgignore Mercurial должен был быть белым списком, он имел бы настоящий синтаксис белого списка. Это черный список и должен использоваться как таковой.

Отрицательный синтаксис lookahead почти работает именно потому, что он не является внутренним парсером регулярных выражений - это тот, который встроен в python и уходит с пути. Отключить негативный взгляд кажется излишним, но, возможно, это лучший выбор.

Два решения лучше, чем при использовании никогда не происходит, чтобы быть вседостаточными к вам отрицательному взгляду вперед обработка:

  • просто переместить в хранилище один уровень ниже - вниз в папку, которую вы действительно хотите отслеживать
  • -или- черный список все, а затем «рт.ст. добавить» файлы, которые вы хотите отслеживать - добавить переопределение игнорировать

серьезно. Это не была назначенная функция, и она никогда не будет работать хорошо, но не может быть удалена по соображениям обратной совместимости.

+0

Ну так из-за большого количества предложений реальный белый список может быть полезной функцией? :) В моем случае ни одно из ваших предложений не применимо, и это может быть популярной ситуацией. Hg - это дополнение для мастера upstream svn. Поэтому нам нужны патчи, которые будут совместимы - внедрены в один и тот же каталог. И разработчики ненадежны в том, чтобы помнить о том, чтобы вручную добавлять каждый раз, когда они что-то создают. Еще хуже, когда он создается для них некоторым инструментом RAD. Я благодарен за то, что по крайней мере такие хакерские белые списки. –

+0

Я не принимал решение о том, чтобы игнорировать только черный список, но я думаю, что он был правильным. Достаточно просто выполнить «hg status --unknown --no-status> .hgignore', чтобы игнорировать все, что в настоящее время существует и не добавлено. Удостоверившись, что люди видят все, что они предпочитают не защищать с помощью «?», Перед ним, по крайней мере, один раз кажется в соответствии с ошибочным замечанием, которое я наблюдал от uu Mercurial. –

+0

Эта функция обсуждается здесь: http://mercurial.selenic.com/bts/issue712 –