Довольно старый вопрос, но так как я боролся с этой проблемой, даже сейчас, я решил, что поделюсь фактическим решением проблемы.
Дело в том, что пока вы не можете зафиксировать пустые каталоги в Git, как если бы они были проигнорированы, это правило не применяется к .gitignore
.
С https://git -scm.com / docs / gitignore
Трейлинг "/ **" соответствует всему, что внутри . Например, «abc / **»
соответствует всем файлам в каталоге "abc" относительно расположения
файл .gitignore с бесконечной глубиной.
Косая черта, за которой следуют две последовательные звездочки, а затем косая черта
ноль или более каталогов. Например, «a / ** / b» соответствует «a / b»,
«a / x / b», «a / x / y / b» и т. д.
** Соответствует всему внутри - буквально всему - файлам И каталогам.
Это приводит нас к следующему пункту в gitignore docs:
Необязательный префикс "!" который отрицает образец; любой соответствующий файл
исключен по предыдущему шаблону, снова будет включен. Это не
можно повторно включить файл, если родительский каталог этого файла
исключены. Git не выводит список исключенных каталогов для производительности
причины, поэтому любые шаблоны на содержащиеся файлы не имеют никакого эффекта, независимо от того,
где они определены. Поставьте обратную косую черту ("\") перед первым
"!" для шаблонов, которые начинаются с буквального «!», например,
"! Важно! .Txt".
Если шаблон заканчивается косой чертой, он удаляется с целью
последующее описание, но он найдет совпадение только с
каталог. Другими словами, foo / будет соответствовать каталогу foo и путям
под ним, но не будет соответствовать обычному файлу или символической ссылке
foo (это согласуется с тем, как вообще работает pathspec в
Git).
Теперь предположим, что у нас есть следующая структура dir:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
И мы хотим игнорировать все файлы внутри кэша / кроме файлов README.
Если мы укажем gitignore следующим образом:
/cache/**
!README
Git будет игнорировать все, кроме /cache/README
. Другой README не будет отображаться, потому что его каталог /cache/dir
был исключен с /cache/**
и !README
даже не будет применяться к нему.
Чтобы решить эту проблему, нам нужно указать gitignore следующим образом:
# Ignore everything inside cache/ dir
/cache/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/cache/**/
# And except for README files
!README