Git ignora las subcarpetas

438

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 así incluir la carpeta "bin" en sí y cualquier dll que contenga.

.gitignore con "bin /" ignora las carpetas "Debug" y "Release", pero también cualquier dll contenido 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 / Debug", que no quiero hacer como yo necesitaré incluir este patrón completo para cada proyecto en mi solución, así como agregarlo para cualquier proyecto nuevo agregado.

¿Alguna sugerencia?

Marcel
fuente
¿Por qué agregar las DLL? Si hace referencia a archivos DLL de terceros, puede tener sentido agregar una carpeta común a la que todos sus proyectos hagan referencia.
Paddy
66
Paddy tiene razón: si se trata de archivos DLL de terceros, probablemente deberían estar organizados fuera de su código. Sin embargo, para mí, parece que está registrando sus propios productos de compilación, que generalmente no es la forma en que desea ir. Utiliza 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 un problema, por ejemplo, ¿qué sucede si cambia el código pero se olvida de crear y registrar nuevos productos?
Cascabel
Tuve un problema al excluir subcarpetas. Probé todo, incluidas las muestras exactas escritas aquí, pero sin éxito. Finalmente agregué una línea en blanco adicional entre los patrones de carpeta, y está funcionando. Quizás un problema de codificación. Tengo windows y codifiqué esto en UTF8.
RoadBump

Respuestas:

552

¿Has probado los comodines?

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

Con la versión 1.8.2 de git, también puede usar el **comodín para que coincida con cualquier nivel de subdirectorios:

**/bin/Debug/
**/bin/Release/
Josh Lee
fuente
8
Funciona, excepto si hay una subcarpeta con otro proyecto en, por ejemplo, Solución / Módulo / Proyecto, así que por ahora he agregado / * / * / bin / Debug y / * / * / * / bin / Debug (para sub carpetas). Parece que tiene que agregar una subcarpeta comodín para cada nivel en la estructura de su directorio.
Marcel
1
@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
Creo que la estrella doble cruzará los límites del directorio, es decir: / ** / bin / Debug
Trent
11
@Taras: Desafortunadamente, no lo hace.
Tuukka Mustonen
2
Hubo un error en Visual Studio relacionado con **. Debería estar arreglado por ahora. enlace
Bogac
106

Puede usar .gitignore en el nivel superior para ignorar todos los directorios del proyecto con el mismo nombre. Por ejemplo:

Debug/
Release/

Esto debería actualizarse de inmediato para que sea visible cuando hagas el estado de git. Asegúrese de que estos directorios no estén ya agregados a git, ya que eso anulará los ignorados.

Andreas
fuente
Lo mismo podría hacerse agregando los patrones al $GIT_DIR/.git/info/excludearchivo OP .
Tim Henigan
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 confirmadores tengan una razón para querer confirmar estos directorios, recomendaría usar .gitignore.
Andreas
1
Otro problema con esto es si tiene un proyecto en su solución llamado Debug, que luego 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 los archivos DLL comunes o referenciados en una carpeta diferente, luego ignorar "bin /" y / o usar comodines.
Marcel
16
+1 Para comentarios sobre cómo garantizar que los directorios aún no se hayan agregado a git. Si ya se agregó a git, haz:git rm -rf DirectoryName/
levibostian
57

La cuestión no está preguntando por ignorar todos los subdirectorios, pero no pudo encontrar la respuesta en cualquier lugar, por lo que voy a publicar: */*.

mgold
fuente
1
¿Alguna posibilidad de que puedas aclarar? He intentado todo tipo de variaciones en esto y no puedo git addignorar un directorio y todos los archivos en todos los subdirectorios de ese directorio. He tratado dirname/, dirname/*, dirname/**, dirname/*/*, incluso en la desesperación dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris
3
*/*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 funciona para mí. ¿Ya se ha comprometido algo en ese directorio?
mgold
Es un nuevo repositorio: elimino todo el .gitdirectorio entre intentos, git initluego git add --all .(también lo he intentado sin --allusar), usando 1.9.4.msysgit.1. Cada subdirectorio no vacío en mi directorio con nombre se agrega al índice (marcado en TortoiseGit y git status). No hay líneas relevantes para .gitignorecomenzar, !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 investigación para proporcionar la información necesaria para diagnosticar. Gracias por asegurarme que no estoy malinterpretando la sintaxis.
Chris
¿Qué sucede si necesito ignorar una carpeta dentro de una carpeta, pero no la primera? Como en forum / ignorethisfolder / ... pero no debe ignorar la carpeta llamada forum
Jean Carlos Racoski
Esto no funciona para mí al ignorar un directorio cuyo nombre comienza con un punto. " /. " y ". * / *" tampoco funcionan.
Tony
44

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 )

Para ignorar los archivos ya agregados, ejecute

$ git rm --cached

De lo contrario, primero tendrá que eliminar todos los archivos del directorio de destino del repositorio, y luego puede ignorar esa carpeta.

ajacian81
fuente
12
git rm: almacenado en caché si desea que no se rastreen / sean irrelevantes para el historial pero desea mantener los archivos intactos localmente.
Erik Reppen
29

Además de poner las entradas correctas en su archivo .gitignore, si está tratando de ignorar algo que ya se agregó al repositorio, debe hacerlo git rm -r /path/to/diry confirmarlo antes de agregar el directorio a su archivo .gitignore. De lo contrario, lo único que git ignorará es su directiva de ignorar.

MedianocheJava
fuente
19

La única forma en que conseguí que esto funcionara en mi máquina fue 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/

Observe cómo debe permitir explícitamente el contenido para cada nivel que desee incluir. Entonces, si tengo subdirectorios 5 profundos debajo de los temas, todavía necesito explicarlo.

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

Estos fueron temas útiles:

También intenté

*
*/*
**/**

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

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

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

Katie
fuente
13

Para excluir contenido y subdirectorios:

**/bin/*

Para excluir todos los subdirectorios pero tomar el contenido, agregue "/":

**/bin/*/
A. Morel
fuente
9

Para ignorar todos los subdirectorios, simplemente puede usar:

**/

Esto funciona a partir de la versión 1.8.2 de git.

frederickjh
fuente
8

La forma genérica de ignorar todas las subcarpetas, mientras se sigue rastreando los archivos que están en el /bindirectorio, sería agregar la siguiente línea al archivo .gitignore de su proyecto:

bin/*/*

Si desea ignorar solo subcarpetas con nombre en particular, puede hacer:

bin/Debug/*
bin/Release/*

nótese bien. si el bindirectorio no está en la raíz de su proyecto (junto con el archivo .gitignore), en lugar de, por ejemplo, bin/*/*puede que necesitespath/to/bin/*/*

Nick F
fuente