Шаблон имени файла для игнорирования файлов в Mercurial

Я использую TortoiseHg, и у меня есть структура папок, как показано ниже:

testSet1
     test1
          filesystem
                    input_1.obj
                    output_1.obj
          etalon_1.obj
          result_1.obj
     test2
          filesystem
                    input_1.obj
                    output_1.obj
          etalon_1.obj
          result_1.obj
     ......
     errors.txt
......
result.xml

Мне нужно игнорировать только файлы .obj, расположенные в каталогах "testSetN / testN", но не в каталогах "testSetN / testN / filesystem". Я использую шаблон glob "* / * / *. Obj" в .hgignore, но он не работает. Mercurial просто игнорирует все файлы .obj во всех каталогах (включая каталог "файловой системы"). Но если я использую, например, «testSet1 / * / *. Obj», то все работает нормально. Как я могу делать то, что мне нужно? Мне не обязательно использовать только глобальный синтаксис. Буду благодарен любому способу.


person Alex    schedule 03.09.2015    source источник
comment
добавление любого объекта в ваше репо кажется странным   -  person jk.    schedule 04.09.2015


Ответы (1)


Глядя на https://www.selenic.com/mercurial/hgignore.5.html#syntax

Ни шаблоны glob, ни regexp не являются корневыми. Шаблон глобального синтаксиса формы * .c будет соответствовать файлу, оканчивающемуся на .c в любом каталоге, а шаблон регулярного выражения формы .c $ будет делать то же самое. Чтобы укоренить шаблон регулярного выражения, запустите его с ^.

В соответствии с этим глобус */*/*.obj будет соответствовать .obj файлам внутри каталога filesystem, потому что глобус не является корневым. Таким образом, он сопоставляет эти файлы, укореняя глобус в testSetN/

Если у вас есть префикс testSet для всех папок, вы можете использовать глобус testSet*/*/*.obj. Таким образом, он будет игнорировать .obj файлы в подкаталоге каталога, который начинается с testSet. - он также игнорирует a/testSetX/testY/Z.obj, а также testSetN/testN/N.obj

Mercurial также позволит вам вручную добавлять файлы, которые в противном случае игнорировались бы в соответствии с .hgignore, поэтому вы можете просто игнорировать все .obj файлы или использовать исходный список */*/*.obj и hg add файлов, которые вы хотите отслеживать.

Изменить: добавление регулярного выражения, как описано в комментариях.

Если вы предпочитаете регулярное выражение или у вас нет шаблона для корневого выражения глобуса, вам необходимо использовать регулярное выражение. Регулярное выражение ^[^/]*/[^/]*/[^/]*\.obj$ для соответствия любому .obj файлу ровно на двух уровнях от корня репозитория. Это:

  • ^, чтобы привязать совпадение к корню репозитория
  • [^/]*/ для соответствия любому каталогу первого уровня. Это любая последовательность символов, не содержащая разделителя каталогов /
  • [^/]*/ снова, чтобы соответствовать любому каталогу второго уровня.
  • [^/]*\.obj$ для соответствия любым именам файлов, которые заканчиваются на .obj
person Sigve Kolbeinson    schedule 03.09.2015
comment
Чтобы укоренить шаблон регулярного выражения, запустите его с ^. Итак, я попытался использовать regexp ^ (. * /. * /. *) \. Obj $, но это тоже не работает. Почему? - person Alex; 04.09.2015
comment
Поскольку . также соответствует / в пути, так что регулярное выражение будет соответствовать любым файлам, которые находятся как минимум на два уровня от корня. Попробуйте сопоставить anything but / вместо any character, т.е. ^[^/]*/[^/]*/[^/]*\.obj$ - person Sigve Kolbeinson; 04.09.2015
comment
Спасибо. ^ [^ /] * / [^ /] * / [^ /] * \. obj $ у меня отлично работает! - person Alex; 04.09.2015