Игнорировать подкаталоги игнорируемых каталогов в Git - PullRequest
77 голосов
/ 10 марта 2011

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

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

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

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

Но это не работает, и при этом не существует нескольких перестановок на одну и ту же тему.

Тот, который работает,

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

Но это кажется немного ограниченным и многословным?

Ответы [ 4 ]

96 голосов
/ 13 марта 2011

В соответствии с разделом формата шаблона документации gitignore :

Необязательный префикс "!"который отрицает образец;любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен. Невозможно повторно включить файл, если родительский каталог этого файла исключен.Git не выводит список исключенных каталогов по соображениям производительности, поэтому любые шаблоны в содержащихся файлах не влияют, независимо от того, где они определены. Поставьте обратную косую черту ("\") перед первым "!"для шаблонов, которые начинаются с литерала "!", например, "! Important! .txt".

Поэтому ранее исключенный шаблон родительского каталога /uploads/rubbish/stuff/keep/ должен быть исключен исключительно перед отрицанием его содержимого.:

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

Чтобы включить подкаталоги в /uploads/rubbish/stuff/keep/, добавьте третью строку:

!/uploads/rubbish/stuff/keep/**/*
29 голосов
/ 10 марта 2011

Даже если вы добавите что-то в .gitignore, вы можете заставить git добавить его в индекс

git add --force uploads/rubbish/stuff/KEEP_ME/

Однако, "KEEP_ME" кажется каталогом и gitобычно не любит пустую папку, поэтому вместо нее можно добавить файл-заполнитель, если папка пуста

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me
5 голосов
/ 14 сентября 2016

Пытался выяснить, как включить определенную папку при исключении всех папок с общим исключением

**/build

Если вы добавите /* в конец общего исключения, вы продолжите исключать всефайлы сборки **/build/*

Затем вы добавляете еще одну строку, чтобы исправить путь, который вы хотите включить, чтобы он выглядел как

!**/folder/build/* 

, оставляя нам gitignore, который читает

**/build/* 
!**/folder/build/* 
0 голосов
/ 26 июня 2019

Буо-Рен Лин и Джон ответы весьма полезны, но мне нужно было объединить оба.

Когда вы хотите исключить другие подпапки каккроме файлов в загрузках, я счел необходимым явно указать произвольные каталоги перед данной папкой как при исключении папки, так и при включении подпапки

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

Я также нашел еенеобходимо явно включить как подпапку, так и ее комментарии, чтобы показать как элементы в папке, так и подпапки.

...