.gitignore Не работает исключение (отмена) игнорирования (со восклицательным знаком !) -- причина. Как исправить

Ранее мы уже говорили об одной ситуации, когда .gitignore "не работает", в этой же заметке рассмотрим ситуацию связанную уже непосредственно с правилами написанными в этом файле.

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

Главная мысль

Если родительская папка (а не её содержимое) данного элемента была проигнорирована ранее в каком-то правиле, то уже не получается отменить данном правило для её потомка.


оригинал
:

It is not possible to re-include a file if a parent directory of that file is excluded.

-- это было актуально до версии 2.8 в будущем, может быть исправят.

Пример

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

# игнорироровать папку и содержимое
*
# Но не сам наш файл:
!.gitignore

Но предположим, что нам захотелось не игнорировать ещё одну подпапку (в этой) скажем её название images -- то есть нам тоже хочется сделать, чтобы она сохранилась по контролем, а содержимое не нужно. Тогда если мы напишем так:

# игнорироровать папку и содержимое
*
# Но не сам наш файл:
!.gitignore
!images/.gitkeep

(используем .gitkeep) -- то исключение
!images/.gitkeep уже не сработает так как предыдущее правило звездочки * уже отправила родительскую для гиткипа папку в игнор (см. "Главную мысль" выше).

Как правильно сохранить поддиректорию без содержимого в .gitignore если нужно игнорировать родителя

А потому правильно сохранить подпапку можно так (содержимое игнора родительской папки):

# игнорироровать содержимое папки в который лежит этот файл
/*
# Но не сам наш файл и не:
!.gitignore
!foiv_images/
/foiv_images/*
!foiv_images/.gitkeep

Разберем эти правила подробнее:

  • /* - игнорирует всё в данной папке (в которой лежит .gitignore), но не саму её, что очень важно -- если просто поставить звездочку, то мы подпадём под правило, что если родитель проинорирован, то вернуть потомка уже нельзя
  • !.gitignore -- отмена игнорирования самого файла
  • !images/ -- отменяем игнор папки (чтобы гиткип внутри её не подпал под правило)
  • /images/* -- но игнорим все содержимое
  • !foiv_images/.gitkeep -- но не игнорим гиткип

Источник: https://stackoverflow.com/questions/5533...