.gitignore exclui arquivos no diretório, mas não em alguns diretórios

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

Isso não parece estar funcionando. Quando eu clono o projeto, não há nenhuma "application/cache"pasta ou "application/cache/folder"pasta, etc ...

Gostaria que os arquivos nas pastas de cache não fossem armazenados em cache, mas sim as pastas, para que as permissões das pastas sejam transferidas e existam.

Mateus
fonte

Respostas:

220

Git não rastreia pastas, apenas arquivos, então se você ignorar tudo em uma pasta, Git não terá nada para rastrear. Você pode adicionar um .gitignorearquivo para cada diretório ( application/cache, application/cache/folder, application/cache/folder/onemorefolder/) com o seguinte conteúdo:

*
!.gitignore

Em seguida, você pode adicionar esses diretórios e apenas o .gitignorearquivo em cada diretório será adicionado - mas isso significa que os diretórios agora serão rastreados (ou seja, criados durante a clonagem).

mipadi
fonte
7
Os arquivos .gitignore usados ​​para essa finalidade podem estar vazios.
kevpie
2
Eles podem estar vazios, se as pastas forem ignoradas por um .gitignorearquivo superior . Neste caso, é exatamente minha resposta.
KingCrunch de
4
mais sensato e simples é usar um arquivo chamado .gitkeep, então você não precisa colocar nada no arquivo .gitignore.
Ouriço de
3
@kevpie Existem outros arquivos na pasta e ele não deseja que sejam rastreados. Se o arquivo .gitignore estiver vazio, esses arquivos aparentemente serão rastreados.
maliayas de
com o mesmo propósito, eu uso em .gitkeepvez de .gitignore. faz mais sentido para mim
Éderson T. Szlachta
22

Git não rastreia diretórios vazios. Basta adicionar alguns arquivos de espaço reservado vazios nas pastas que você deseja enviar.

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

Faça isso também com cada pasta "vazia". Posteriormente, você pode ignorar esses arquivos, eles realmente existem apenas para garantir que o git crie esses diretórios no clone. As entradas em .gitignoreevitam que outros arquivos dentro das pastas sejam rastreados (a menos que você force com git add -f;)).

KingCrunch
fonte
16

Talvez haja outra maneira mais limpa de fazer isso. Em vez de ter arquivos sub .gitignore nas pastas que deseja manter. Você pode colocá-lo na raiz .gitignore da seguinte maneira:

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

Agora apenas crie e confirme arquivos .gitkeep vazios nos diretórios conforme listado acima. A pasta será monitorada com os arquivos .gitkeep, mas nenhum conteúdo será monitorado.

Joel Duckworth
fonte
2
ou apenas !*.gitkeep:)
Éderson T. Szlachta
A questão era como ignorar o conteúdo das pastas, mas manter as próprias pastas. Portanto, acredito que minha resposta se mantém e apenas ter! *. Gitkeep não vai ignorar o conteúdo das pastas.
Joel Duckworth
3

você pode colocar um arquivo .gitignore em cada um deles (como mipadi disse) ou fazer algo parecido com seu arquivo .gitingnore raiz

/assets/*/
/assets/*.*

Isso funciona bem para mim

Claude Janz
fonte
Isso funciona, mas apenas se o repo estiver usando extensões de arquivo. Algo como root/LICENSE-FILEnão será excluído.
Brett Zamir
2

O Visual Studio não gostou da resposta aceita. Tive que adicionar uma nova linha antes de * para fazer funcionar.

# Ignore all files in this folder.
*
!.gitignore
Stephen
fonte