.gitignore excluye archivos en el directorio pero no en ciertos directorios

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

Esto no parece estar funcionando. Cuando clono el proyecto, no hay "application/cache"carpeta o "application/cache/folder"carpeta, etc.

Me gustaría que los archivos de las carpetas de caché no estuvieran almacenados en caché, pero las carpetas sí, para que los permisos de las carpetas se transfieran y existan.

Mateo
fuente

Respuestas:

220

Git no rastrea carpetas, solo archivos, por lo que si ignora todo en una carpeta, Git no tendrá nada que rastrear. Puede añadir un .gitignorearchivo a cada directorio ( application/cache, application/cache/folder, application/cache/folder/onemorefolder/) con el siguiente contenido:

*
!.gitignore

Luego, puede agregar esos directorios, y solo se agregará el .gitignorearchivo en cada directorio, pero esto significa que los directorios ahora serán rastreados (es decir, creados al clonar).

mipadi
fuente
7
Los archivos .gitignore utilizados para este propósito pueden estar vacíos.
kevpie
2
Pueden estar vacíos, si un .gitignorearchivo superior ignora las carpetas . En este caso, es exactamente mi respuesta.
KingCrunch
4
más sensato y simple es usar un archivo llamado .gitkeep, entonces no tiene que colocar nada en el archivo .gitignore.
Hedgehog
3
@kevpie Hay otros archivos en la carpeta y no quiere que se rastreen. Si el archivo .gitignore está vacío, aparentemente se realizará un seguimiento de esos archivos.
maliayas
con el mismo propósito, utilizo en .gitkeeplugar de .gitignore. tiene más sentido para mí
Éderson T. Szlachta
22

Git no rastrea directorios vacíos. Simplemente agregue algunos archivos de marcador de posición vacíos en las carpetas que desea confirmar.

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

Haga esto también con cada carpeta "vacía". Más tarde, puede ignorar estos archivos, realmente solo existen para asegurarse de que git cree esos directorios en el clon. Las entradas en .gitignoreevitan que otros archivos dentro de las carpetas sean rastreados (a menos que lo fuerce con git add -f;)).

KingCrunch
fuente
16

Hay otra forma quizás más limpia de hacer esto. En lugar de tener archivos sub .gitignore en las carpetas que desea conservar. Puede poner esto en la raíz .gitignore de la siguiente manera:

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

Ahora simplemente cree y confirme archivos .gitkeep vacíos en los directorios enumerados anteriormente. Luego, la carpeta se rastreará con esos archivos .gitkeep, pero no se rastreará ninguno de los contenidos.

Joel Duckworth
fuente
2
o simplemente !*.gitkeep:)
Éderson T. Szlachta
La cuestión era cómo ignorar el contenido de las carpetas pero conservar las carpetas en sí. Así que creo que mi respuesta es válida y solo tener! *. Gitkeep no ignorará el contenido de las carpetas.
Joel Duckworth
3

puede poner un archivo .gitignore en cada uno de ellos (como dijo mipadi) o hacer algo así en su archivo raíz .gitingnore

/assets/*/
/assets/*.*

Funciona bien para mí

Claude Janz
fuente
Esto funciona, pero solo si el repositorio usa extensiones de archivo. Algo como root/LICENSE-FILEno se excluirá.
Brett Zamir
2

A Visual Studio no le gustó la respuesta aceptada. Tuve que agregar una nueva línea antes del * para que funcione.

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