Unignore подкаталогов игнорируемых каталогов в Git

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

/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/

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

Ответ 1

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

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

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

#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/**/*

Ответ 2

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

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

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

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

Ответ 3

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

**/build

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

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

!**/folder/build/* 

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

**/build/* 
!**/folder/build/* 

Ответ 4

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

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

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

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