2010-03-30 27 views
249

Tengo muchos proyectos en mi solución .Net. Me gustaría excluir todas las carpetas "bin/Debug" y "bin/release" (y sus contenidos), pero aún incluiré la carpeta "bin" y cualquier dll contenida en ella.Git ignora las subcarpetas

.gitignore con "bin /" ignora las carpetas "Debug" y "Release", pero también las dll contenidas en la carpeta "bin".

"bin/Debug" o "bin/Release" en el archivo .gitignore no excluye los directorios, a menos que califique completamente el patrón de ignorar como "Solución/Proyecto/bin/Depuración" - que no quiero para hacer, ya que necesitaré incluir este patrón completo para cada proyecto en mi solución, así como agregarlo para cualquier nuevo proyecto agregado.

¿Alguna sugerencia?

+0

¿Por qué agregar los DLL? Si hace referencia a archivos DLL de terceros, puede tener sentido agregar una carpeta común a la que hagan referencia todos sus proyectos. – Paddy

+4

Paddy tiene razón: si se trata de DLL de terceros, probablemente deberían organizarse lejos de su código. Para mí, sin embargo, parece que estás revisando tus propios productos de construcción, que generalmente no es la forma en que quieres ir. Usas git para rastrear la * información *, que está completamente contenida en el código y la configuración de compilación. Los productos son, bueno, productos. Rastrearlos es buscar problemas, por ejemplo, ¿qué sucede si cambias el código pero te olvidas de crear y verificar nuevos productos? – Cascabel

+0

Tuve un problema al excluir subcarpetas. Intenté todo, incluso las muestras exactas escritas aquí, pero sin éxito. Finalmente, agregué una línea en blanco adicional entre los patrones de las carpetas, y está funcionando. Tal vez un problema de codificación. Tengo ventanas y codifiqué esto en UTF8. – RoadBump

Respuesta

321

¿Has probado los comodines?

Solution/*/bin/Debug 
Solution/*/bin/Release 

Con la versión 1.8.2 de Git, también puede utilizar el comodín ** para adaptarse a cualquier nivel de subdirectorios:

**/bin/Debug/ 
**/bin/Release/ 
+7

Funciona, excepto si hay una subcarpeta con otro proyecto, p. Solución/Módulo/Proyecto así que por ahora he añadido/*/*/bin/Debug y/*/*/*/bin/Debug (para subcarpetas). Parece que debe agregar una subcarpeta comodín para cada nivel en la estructura de su directorio. – Marcel

+0

@Marcel: Bueno, git ciertamente no va a ignorar ningún archivo que no le digas: ignora lo que coincida con los comodines, ni más ni menos. – Cascabel

+0

Creo que la estrella doble cruzará los límites del directorio, es decir:/**/bin/Debug – Taras

84

Puede utilizar .gitignore en el nivel superior de ignorar todos los directorios en el proyecto con el mismo nombre. Por ejemplo:

Debug/ 
Release/ 

Esto debería actualizarse inmediatamente para que esté visible cuando se hace el estado de git. Asegúrese de que estos directorios no estén agregados a git, ya que eso anulará los ignores.

+0

Lo mismo podría hacerse agregando los patrones al archivo OP '$ GIT_DIR/.git/info/exclude'. –

+1

La diferencia es que el archivo .gitignore seguirá el código, por lo que se aplica en todas partes. Mientras que el archivo de exclusión es local solo para su repositorio, lo que significa que solo se aplica a ese repositorio específico. A menos que otros committers tengan una razón para querer comprometer estos directorios, recomendaría usar .gitignore. – Andreas

+1

Otro problema con esto es si tiene un proyecto en su solución llamado Debug, que también será ignorado. Creo que la solución es una combinación de todas las respuestas y comentarios: reestructurar la solución para mantener dll comunes o referenciados en una carpeta diferente, ignorar "bin /" y/o usar comodines. – Marcel

38

La pregunta no es preguntar sobre ignorar todos los subdirectorios, pero no pude encontrar la respuesta en ningún lado, así que lo publicaré: */*.

+1

¿Alguna posibilidad de que puedas aclarar? He intentado todo tipo de variaciones sobre esto y no puedo hacer que 'git add' ignore un directorio y todos los archivos en todos los subdirectorios de ese directorio. He intentado 'dirname /', 'dirname/*', 'dirname/**', 'dirname/*/*', incluso en desesperation 'dirname/*/*/*', 'dirname/*/*/*/* ',' dirname/*/*/*/*/* '. – Chris

+2

'*/*' ignora todos los subdirectorios pero no los archivos en el directorio actual. Ignorar un subdirectorio específico es el uso normal de gitignore. 'dirname',' dirname/', y' dirname/* 'todo me funciona. ¿Ya se ha confirmado algo en ese directorio? – mgold

+0

Es un repositorio completamente nuevo: elimino todo el directorio '.git' entre intentos, luego' git init' y luego 'git add --all .' (también lo he intentado sin' --all'), usando 1.9.4 .msysgit.1. Cada subdirectorio no vacío en mi directorio nombrado se agrega al índice (marcado en TortoiseGit y 'git status'). No hay líneas relevantes en '.gitignore' que comienza'! 'Pero debe haber algún conflicto. Resuelto por ahora eliminando las carpetas durante 'add'. Supongo que esto es algo que requerirá un poco más de excavación para proporcionar la información necesaria para diagnosticar. Gracias por asegurarme que no estoy malinterpretando la sintaxis. – Chris

21

Todas las respuestas anteriores son válidas, pero algo que no creo que se mencione es que una vez que agrega un archivo de ese directorio al repositorio, no puede ignorar ese directorio/subdirectorio que contiene ese archivo (git ignorará esa directiva). Primero tendrá que eliminar todos los archivos del directorio de destino del repositorio y luego podrá ignorar esa carpeta.

+5

git rm --cached si quieres que no se rastree/irrelevante para el historial, pero quieres mantener los archivos intactos localmente. –

+0

Gracias por esta respuesta, ¡me ayudó mucho! Ilustra otra razón por la que git apesta. – user949300

12

La única manera que tengo que esto funcione en mi máquina era hacerlo de esta manera:

# Ignore all directories, and all sub-directories, and it's contents: 
*/* 

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't): 
/*.* 

#Only Include these specific directories and subdirectories: 
!wordpress/ 
!wordpress/*/ 
!wordpress/*/wp-content/ 
!wordpress/*/wp-content/themes/ 

Aviso cómo se tiene que permitir explícitamente el contenido para cada nivel que desee incluir. Entonces, si tengo subdirectorios 5 muy por debajo de los temas, aún necesito deletrear eso.

Esto es de @ comentario de Yarin aquí: https://stackoverflow.com/a/5250314/1696153

Estos fueron los temas útiles:

También probé

* 
*/* 
**/** 

y **/wp-content/themes/**

o /wp-content/themes/**/*

Nada de eso funcionó para mí, tampoco. ¡Un montón de rastro y error!

+3

Gracias por compartir esto. Era el ejemplo que necesitaba para que nuestro equipo se alejara de Git. – raindog308

2

La forma genérica de ignorar todas las subcarpetas, sin dejar de realizar un seguimiento de los archivos que se encuentran en el directorio /bin sería añadir la siguiente línea al archivo .gitignore de su proyecto:

bin/*/* 

Si desea ignorar solo determinadas subcarpetas con nombre, puede hacer:

bin/Debug/* 
bin/Release/* 

nb. si el directorio bin no está en la raíz de su proyecto (junto con el archivo .gitignore), en lugar de, por ejemplo, bin/*/* que pueda necesitar path/to/bin/*/*

14

Además de poner las entradas correctas en su archivo .gitignore, si está tratando de hacer caso omiso de algo que ya está añadido al repositorio, que tiene que hacer y comprometerse git rm -r /path/to/dir que antes de agregar el directorio a su archivo. archivo gitignore. De lo contrario, lo único que ignorará Git es su directiva de ignorar.

2

para ignorar todos los subdirectorios puede simplemente usar:

**/ 

Esto funciona partir de la versión 1.8.2 de Git.

Cuestiones relacionadas