¿Cómo le digo a Git que ignore todo excepto un subdirectorio?

218

Quiero ignorar todos los archivos en mi repositorio excepto aquellos que ocurren en el binsubdirectorio. Intenté agregar lo siguiente a mi .gitignore:

*
!bin/*

Sin embargo, esto no tiene el efecto deseado: creé un nuevo archivo dentro bin/, pero git statusaún se muestra nothing to commit (working directory clean).

¿Alguna sugerencia?

Michael Goerz
fuente

Respuestas:

273

Esto ignora los archivos raíz y los directorios raíz, luego ignora el directorio raíz bin:

/*
/*/
!/bin/

De esta forma, obtiene todo el directorio bin, incluidos los subdirectorios y sus archivos.

Tyler Laing
fuente
25
Por alguna razón, esto no funciona constantemente para mí. Tengo las dos líneas /stuff/y !/stuff/specific/, pero todavía ignora / cosas / específicas /
LB--
1
@ LB-- Tuve un problema similar y git check-ignore -vme dijo que era por~/.gitignore
gurney alex
@gurneyalex Descubrí que se corrige solo si elimino el repositorio local y lo vuelvo a clonar, debe ser un error.
LB--
2
¿Es necesario el / * /?
Alex Baker
3
Esto no funcionó para mí. Tuve que agregar !/bin/a mi .gitignorearchivo raíz , pero además tuve que agregar un /bin/.gitignorearchivo con !*... Hacer solo uno de esos cambios no funcionó. Solo funcionó después de combinar ambos cambios.
Felipe Brahm
113

Aquí cómo ignorar todo, excepto un directorio " MY_SUPER_DUPER_TEMPLATE_directory " en algún directorio

Estructura: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
fuente
1
¡Esto funcionó de maravilla para cancelar la anulación de un paquete de proveedor de laravel que había modificado! Gracias, me ahorraste muchos dolores de cabeza
Maria Vilaró
Esto debe seleccionarse como la mejor respuesta.
Bahman. A
63

Debe excluir todo en el camino a los destinos, pero debe incluir los destinos:

Nota: Este es un archivo de exclusión (es decir .gitignore) por lo que la lógica se invierte. Ignorar todo, excepto el directorio tsp, ignorar todo en el directorio tsp, excepto el directorio src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
fuente
11
+1 por el principio de incluir un directorio, luego, excluyendo su contenido, luego, incluyendo el subdirectorio deseado, etc. Terminé usando esta respuesta en mis proyectos.
John Jesus
40

El único problema que tiene es que el bindirectorio en sí no coincide con el bin/*patrón, por lo que git ni siquiera se ve en el bindirectorio.

Hay dos soluciones que vienen a la mente.

.gitignore :

*
!/bin/
!bin/*

o

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Prefiero la segunda solución ya que la primera solución no dejará de ignorar los archivos en el bindirectorio que están en subdirectorios que no se llaman bin. Esto puede o no importar en su situación.

CB Bailey
fuente
2
No funciono para mi. Tengo que tener un .gitignore como este para que funcione: ¿ # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* No hay código de bloqueo en los comentarios?
xlttj
1
La respuesta de Tyler tiene una mejor solución de archivo único
Yarin
19

Del documento oficial de git , uno de los ejemplos dice:

Ejemplo para excluir todo excepto un directorio específico foo / bar (tenga en cuenta el / * - sin la barra inclinada, el comodín también excluiría todo dentro de foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Para una explicación sobre la barra inclinada: Cuándo usar la barra inclinada en gitignore .

solsticio333
fuente
¡Un millón de gracias, esto funcionó para mí! Tenga en cuenta para otros que el orden de las líneas aquí es importante, ¡no puede tener! / Foo / bar antes / foo / * por ejemplo.
Iamsodarncool
13

Intenta seguir en la última versión de GIT.

*
!*/
!/path/to/your/dir/**
Kirby
fuente
en realidad debería ser! / path / to / your / dir / ** para la última línea
faham
@faham, sí, lo acabo de agregar.
Kirby el
11

Creo que una mejor manera sería anclar cada patrón al directorio superior de git comenzando el patrón con una barra diagonal:

/*
!/public_html
!/.gitignore

En lugar de ignorar todos los archivos, solo ignorará los archivos de nivel superior, no los del directorio que no desea ignorar.

Jake
fuente
8

Esto .gitignorefunciona para mi:

*/
/*
!bin/
Trianam
fuente
5

Prueba este oscuro error de git.

!bin**/**

Espero eso ayude :)

Documentos de soporte git bug sample

PD: pruébalo primero antes de comentar.

david
fuente
0

Tuve que hacer esto recientemente:

*
!sub-dir/
!sub-dir/*

No estoy seguro de por qué necesito dos líneas para excluir una carpeta, pero esto es lo que funcionó para mí y macos.

Enrique
fuente