.gitignore исключает файлы в каталоге, но не определенные каталоги

98
application/cache/*
application/cache/folder/*
application/cache/folder/onemorefolder/*

Кажется, это не работает. Когда я клонирую проект, нет "application/cache"папки, "application/cache/folder"папки и т. Д.

Я бы хотел, чтобы файлы в папках кеша не кешировались, а папки были, чтобы права доступа к папкам передавались и существовали.

Мэтью
источник

Ответы:

220

Git не отслеживает папки, а только файлы, поэтому, если вы проигнорируете все в папке, Git не будет ничего, что нужно было бы отслеживать. Вы можете добавить .gitignoreфайл в каждом каталоге ( application/cache, application/cache/folder, application/cache/folder/onemorefolder/) со следующим содержанием:

*
!.gitignore

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

мипади
источник
7
Файлы .gitignore, используемые для этой цели, могут быть пустыми.
kevpie 08
2
Они могут быть пустыми, если папки игнорируются верхним .gitignoreфайлом. В данном случае это точный мой ответ.
KingCrunch
4
разумнее и проще использовать файл с именем .gitkeep, тогда вам не нужно ничего помещать в файл .gitignore.
Ежик
3
@kevpie В папке есть другие файлы, и он не хочет, чтобы они отслеживались. Если файл .gitignore пуст, эти файлы, по-видимому, будут отслеживаться.
Maliayas
с той же целью я использую .gitkeepвместо .gitignore. для меня это имеет больше смысла
Эдерсон Т. Шлахта
22

Git не отслеживает пустые каталоги. Просто добавьте несколько пустых файлов-заполнителей в папки, которые вы хотите зафиксировать.

touch application/cache/.keep
git add -f application/cache/.keep

Сделайте то же самое с каждой «пустой» папкой. Позже вы можете игнорировать эти файлы, они действительно существуют только для того, чтобы git создавал эти каталоги в клоне. Записи в не .gitignoreпозволяют отслеживать другие файлы в папках (если только вы не принудительно используете git add -f;)).

KingCrunch
источник
16

Есть еще один, возможно, более чистый способ сделать это. Вместо того, чтобы иметь дополнительные файлы .gitignore в папках, которые вы хотите сохранить. Вы можете поместить это в корневой .gitignore следующим образом:

application/cache/*
application/cache/folder/*
application/cache/folder/onemorefolder/*
!*.gitkeep

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

Джоэл Дакворт
источник
2
или просто !*.gitkeep:)
Éderson T. Szlachta
Вопрос был в том, как игнорировать содержимое папок, но оставить сами папки. Поэтому я считаю, что мой ответ остается в силе, и просто! *. Gitkeep не проигнорирует содержимое папок.
Джоэл Дакворт,
3

вы можете поместить файл .gitignore в каждый из них (как сказал mipadi) или сделать что-то подобное в своем корневом файле .gitingnore

/assets/*/
/assets/*.*

Он отлично работает для меня

Клод Янц
источник
Это работает, но только если репо использует расширения файлов. Ничего подобного root/LICENSE-FILEне исключено.
Brett Zamir
2

Visual Studio не понравился принятый ответ. Мне пришлось добавить новую строку перед *, чтобы она работала.

# Ignore all files in this folder.
*
!.gitignore
Стивен
источник