#git #regex-negation
#мерзавец #отрицание регулярных выражений #git #регулярное выражение-отрицание
Вопрос:
На сервере Windows каждый день создается папка с датойнесколькими CSV-файлами. Мне нужно зафиксировать только те файлы, которые представляют строку 02. во имя.
mm-dd-yyfilename02-fdsfsf.csv (ignore this pattern)
mm-dd-yydata_collection_status (ignore this pattern)
mm-dd-yydat (ignore this pattern)
mm-dd-yyfilename02.mmddyy.csv (i want to commit only these types of file)
Я создал файл .gitignore следующим образом:
*
!.gitignore
!*02.*
И когда я запускаю git status, он идентифицирует только .gitignore .
Для тестирования изменил файл .gitignore следующим образом:
*02.*
!.gitignore
В результате он проигнорировал файлы с шаблоном 02..
Это указывает на правильность шаблона 02., так почему же он не отрицает это, когда я использую !02. ?
Любая помощь будет очень кстати, спасибо!
Ответ №1:
Я провел еще несколько тестов, и кажется, что этот шаблон в файле gitignore решает проблему:
*
!**/
!*02.*
!.gitignore
В любом случае спасибо и насколько это полезно
Согласно @torek, это также сработает, если мы изменим вторую строку с !**/
на !*/
Пожалуйста, проверьте комментарии, вы можете найти очень четкое объяснение @torek о том, как это работает.
Комментарии:
1. Важной частью здесь является вторая строка (которая должна идти после первой строки). Строка может быть сокращена до более простой
!*/
, но версия с двумя звездочками дает тот же результат.2. приятно, спасибо @torek , действительно, это тоже работает
!*/
, мне потребовалось много времени, чтобы разобраться (что касается второй строки), я все еще не уверен, понимаю ли я иерархию, которой нужно следовать, чтобы получить ожидаемые результаты, но я многому научился сегодня, и спасибо за ваш комментарий 🙂3. Хитрости здесь таковы: (1) Git как бы подчиняется строкам «по порядку». (2) Когда Git находит подкаталог рабочего дерева (папку в основной папке рабочего дерева или любую ее подпапку) путем медленного, мучительного сканирования родительского каталога по одной записи за раз, у него есть выбор: медленно, мучительно сканировать сам подкаталог по одной записи за раз? Или полностью пропустить каталог, что будет намного быстрее? Git выполнит «полный пропуск», если
.gitignore
файл позволяет это.!*/
Запись сообщает об этом: не разрешается пропускать ни один каталог .4. Следовательно, вариант с just
*
и!*02.*
приводит к тому, что Git пропускает все подкаталоги полностью. Добавление!*/
after*
гласит «пропустить все файлы, кроме никогда не пропускайте каталоги», и поскольку «исключение» позже , оно переопределяет. (Тогда!*02
и!.gitignore
переопределите для этих файлов тоже.)5. Я понял вашу точку зрения, теперь для меня это имеет гораздо больше смысла. Спасибо за это любезное объяснение 🙂