проблема .gitignore Мне нужно отслеживать файлы только с помощью !* 02.* шаблона, но я могу только исключить их, чтобы не отслеживать их с помощью!* 02.*

#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. Я понял вашу точку зрения, теперь для меня это имеет гораздо больше смысла. Спасибо за это любезное объяснение 🙂