2009-08-08 12 views
165

Quiero ignorar todos los archivos en mi repositorio, excepto los que se encuentran en el subdirectorio bin. He intentado añadir lo siguiente a mi .gitignore:¿Cómo le digo a Git que ignore todo excepto un subdirectorio?

* 
!bin/* 

Esto no tiene el efecto deseado, sin embargo: He creado un nuevo archivo dentro de bin/, pero haciendo git status aún muestra nothing to commit (working directory clean).

¿Alguna sugerencia?

+0

Posible duplicado de la carpeta [.gitignore exclude pero incluye una subcarpeta específica] (http://stackoverflow.com/questions/5533050/gitignore-exclude-folder-but-include-subific-subfolder) – 1615903

Respuesta

212

Esto ignora archivos raíz & directorios raíz, a continuación, un-ignora el directorio bin de la raíz:

/* 
/*/ 
!/bin/ 

esta manera se obtiene la totalidad del directorio bin , incluidos los subdirectorios y sus archivos.

+13

Por alguna razón, esto no funciona de manera consistente para mí. Tengo las dos líneas '/ stuff /' y '!/Stuff/specific /', pero todavía ignora/stuff/specific/ –

+1

@ LB-- Tuve un problema similar, y 'git check-ignore -v' dijo me fue por '~/.gitignore' –

+0

@gurneyalex Descubrí que se soluciona si borro el repositorio local y lo vuelvo a clonar, debe ser un error. –

36

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

Hay dos soluciones que vienen a la mente.

.gitignore:

* 
!/bin/ 
!bin/* 

o

.gitignore:

* 
!/bin/ 

bin/.gitignore:

!* 

prefiero los s econd solution como la primera solución no dejará de ignorar archivos en el directorio bin que se encuentran en subdirectorios que no se llaman bin. Esto puede o no importar en su situación.

+2

No funcionó para mí . Tengo que tener una .gitignore como esta para hacer que funcione: '# ignorar todo * # Pero no estos archivos ... /wp-content/ /wp-content/plugins/ ! !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* ' ¿No hay código de bloque en los comentarios? – xlttj

+1

[La respuesta de Tyler] (http://stackoverflow.com/a/8594971/165673) tiene una mejor solución de archivo único – Yarin

10

creo que una mejor manera sería la de anclar cada patrón en el directorio Git superior iniciando el patrón con una barra:

/* 
!/public_html 
!/.gitignore 

En lugar de ignorar todos los archivos sólo se ignorará archivos de nivel superior, no el unos en el directorio que no quieres ignorar.

6

Este .gitignore funciona para mí:

*/ 
/* 
!bin/ 
74

Aquí cómo ignorar todo exepto 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 
+1

esto resolvió el subdirectorio para mí. gracias – frostymarvelous

+5

funciona. algo menos doloroso para el ojo? – ed22

+0

¡Esto funcionó de maravillas para desmarcar un paquete de proveedor laravel que había modificado! Gracias, me salvaste un montón de dolores de cabeza –

41

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

/* 
!/tsp 
/tsp/* 
!/tsp/src 
/tsp/src/* 
!/tsp/src/*.h 
!/tsp/src/*.cpp 
!/tsp/src/data.txt 
!/.gitignore 

Ignorar todo, excepto el directorio tsp, ignorar todo en el directorio tsp, excepto el directorio src ...

+9

+1 por el principio de incluir un directorio, luego, excluir su contenido, luego, incluyendo el subdirectorio deseado, etc. Terminé usando esta respuesta en mis proyectos. –

10

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

* 
!*/ 
!/path/to/your/dir/** 
+0

en realidad debería ser!/Ruta/a/su/dir/** para la última línea – faham

+0

@faham, sí, acaba de agregarlo. – Kirby

5

prueba este obscuro error de git.

!bin**/** 

espero que ayude :)

documentos de apoyo git bug sample

PD: probar primero antes de comentar.

9

Desde el git doc oficial, uno de los ejemplos dice:

Ejemplo de excluir todo excepto un directorio foo/bar específica (nótese el/* - sin la barra, 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 acerca de la barra inicial: When to use leading slash in gitignore.

Cuestiones relacionadas