ignorando cualquier directorio 'bin' en un proyecto git

1237

Tengo una estructura de directorios como esta:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Dentro de main y tools, y cualquier otro directorio, en cualquier nivel, puede haber un directorio 'bin', que quiero ignorar (y quiero ignorar todo lo que está debajo). He intentado cada uno de estos patrones en .gitignore pero ninguno de ellos funciona:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

¿Puede alguien ayudarme? El primer patrón (el que creo que debería funcionar) funciona bien si hago esto:

/main/**/bin/**/*

Pero no quiero tener una entrada para cada directorio de nivel superior y no quiero tener que modificar .gitignore cada vez que agrego uno nuevo.

Esto está en Windows usando el último msysgit.

EDITAR: una cosa más, hay archivos y directorios que tienen la subcadena 'bin' en sus nombres, no quiero que se ignoren :)

Ben Hymers
fuente
14
Probablemente alguien lo encuentre útil: si tiene pocos repositorios y cada uno tiene el mismo archivo .gitignore, puede ponerlo en una ubicación "común" y ejecutar> git config --global core.excludesfile ~ / .gitignore_global El último parámetro es la ruta a la ubicación común. PD: Soy nuevo en git y no estoy seguro de si esa es la recomendación de 'mejores prácticas' Por favor, avíseme si no desea hacer eso. Gracias.
Budda
La **sintaxis parece ahora (marzo de 2013, git 1.8.2) documentada oficialmente: vea mi respuesta a continuación
VonC
2
Si alguien quiere leer la versión más actualizada de la página del manual actual, vea la página del manual de gitignore (5) .
opción más amigable si estás cansado de leer ensayos para obtener el valor de una línea en atlassian.com/git/tutorials/saving-changes/…
suazithustra

Respuestas:

1835

Antes de la versión 1.8.2, **no tenía ningún significado especial en el .gitignore. A partir de 1.8.2, git admite **cero o más subdirectorios (consulte las notas de la versión ).

La forma de ignorar todos los directorios llamados bin en cualquier lugar debajo del nivel actual en un árbol de directorios es con un .gitignorearchivo con el patrón:

bin/

En la manpágina, hay un ejemplo de ignorar un directorio llamado foousando un patrón análogo.

Editar: si ya tiene carpetas bin en su índice git que ya no desea rastrear, entonces debe eliminarlas explícitamente. Git no dejará de rastrear rutas que ya se están rastreando solo porque ahora coinciden con un nuevo .gitignorepatrón. Ejecute una carpeta remove ( rm ) del índice solamente ( --cached ) recursivamente ( -r ). Ejemplo de línea de comando para la carpeta bin raíz:

git rm -r --cached bin
CB Bailey
fuente
72
Comenzando con git 1.8.2, git aceptará **en .gitignorearchivos (fuente: 1.8.2 changelog )
Carlos Campderrós
15
es binlo mismo de bin/?
Nisba
29
@Nisba, son diferentes, binignorarán los archivos llamados bin, mientras bin/que para los directorios llamados bin
Rani Kheir
8
desde que caí sobre esto: el nombre de la carpeta en git-command ES distingue entre mayúsculas y minúsculas :) "bin! = Bin" - tal vez le dejo a alguien unos minutos por esta pista :)
dba
1
En windows10 no puede crear un archivo .gitignore, debe crear un gitignore.txt y luego ejecutar ren gitignore.txt .gitignore en el símbolo del sistema para crear este archivo
mal estado el
463

El .gitignorede tu sueño parece ser:

bin/

en el nivel superior

Michael Krelin - hacker
fuente
Muchas gracias por su ayuda, simplemente no olvide revisar el ejemplo de los archivos ignorados: git checkout bin *
Chris Sim
1
ponlo en gitignore_global
μολὼν.λαβέ
@GAlexander, ¿por qué querría ignorar globalmente bin / directorios? A menudo tienen contenido versionado. E ignorar globalmente no afectará a otros usuarios del repositorio.
Michael Krelin - hacker
234

Creo que vale la pena mencionar para los principiantes de git:

Si ya tiene un archivo registrado y desea ignorarlo, Git no ignorará el archivo si agrega una regla más adelante . En esos casos, primero debe rastrear el archivo ejecutando el siguiente comando en su terminal:

git rm --cached

Entonces, si desea agregar para ignorar algunos directorios en su repositorio local (que ya existen) después de editar .gitignore, desea ejecutar esto en su directorio raíz

git rm --cached -r .
git add .

Básicamente 'actualizará' su repositorio local y eliminará los archivos ignorados.

Ver:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

plancys
fuente
si generalmente hago un git add -Aen mis commits, ¿puedo usar esto en su lugar? ¿y puedo reemplazar el punto con -A en la primera línea también?
ajax333221
69

El **no funcionaba correctamente antes, pero desde Git 1.8.2 (marzo 8 de 2013) , parece ser mencionado y apoyado de forma explícita:

Los patrones .gitignorey los .gitattributesarchivos pueden tener **/, como un patrón que coincida con 0 o más niveles de subdirectorio .

Por ejemplo, " foo/**/bar" coincide " bar" en " foo" sí mismo o en un subdirectorio de " foo".

En su caso, eso significa que esta línea ahora podría ser compatible:

/main/**/bin/
VonC
fuente
46
[Bb]in/

coincide con mayúsculas y minúsculas

wisbucky
fuente
2
[B]in/será la única mayúscula
Gank
¿Cómo dejar que solo la Bincarpeta ignore y dejar que se bincomprometa con git? [B]in/ambos se comprometerán Biny bin.
Gank
55
Esto debería hacerlo, @Gank: Bin/ !bin/
Marco G
34

No lo vi mencionado aquí, pero esto parece ser sensible a mayúsculas y minúsculas. Una vez que cambié a / Bin, los archivos fueron ignorados como se esperaba.

Cory
fuente
3
Esta no es una respuesta a la pregunta original que era explícitamente sobre bin, no Bin.
CB Bailey
50
Aunque no es una respuesta, se agrega a la integridad de otros que buscan el mismo problema (yo mismo, ahora mismo).
Jay
25

[Bb]in resolverá el problema, pero ... Aquí hay una lista más extensa de cosas que debe ignorar (lista de muestra de GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
fuente
3
Nota: cosas como esta debe estar en su gitignore GLOBAL (por lo general en su directorio personal.) El gitignore proyecto sólo debe ignorar cosas específicas a su proyecto (es decir, archivos .o para una aplicación C.)
BraveNewCurrency
18

Si está buscando un gran .gitignorearchivo global para cualquier solución de Visual Studio (.NET), le recomiendo que use este: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK tiene el más completo .gitignorepara proyectos .NET.

Jochen van Wylick
fuente
55
Esto realmente no responde la pregunta, pero es exactamente lo que estaba buscando.
Dave
18

Paso 1: Agregue el siguiente contenido al archivo .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Paso 2: asegúrese de tener efecto

Si el problema persiste, eso se debe a que la configuración en .gitignore solo puede ignorar los archivos que originalmente no fueron rastreados . Si algunos archivos ya se han incluido en el sistema de control de versiones, la modificación de .gitignore no es válida. Para resolver este problema por completo, debe abrir Git Bash o Package Manager Console (vea la captura de pantalla a continuación) para ejecutar los siguientes comandos en la carpeta raíz del repositorio.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Consola PM Entonces el problema estará completamente resuelto.

Bravo Yeung
fuente
8

Literalmente, ninguna de las respuestas realmente funcionó para mí; el único que funcionó para mí fue (en Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
fuente
¿Ignoraba eso también todas las carpetas nombradas binen los subdirectorios?
vineeshvs
5

Como un aviso;

Si piensa .gitignoreque no funciona de alguna manera (así que agregó la foo/*carpeta pero git statusaún muestra los contenidos de la carpeta como modificados o algo así), puede usar este comando;

git checkout -- foo/*

K-Gun
fuente
3

para 2.13.3 en adelante, escribir solo bin en su archivo .gitignore debería ignorar el bin y todos sus subdirectorios y archivos

compartimiento

Nikhil Karanjkar
fuente
2

Agregar ** / bin / al archivo .gitignore fue el truco para mí (Nota: la carpeta bin no se agregó al índice).

Dhwaneel
fuente
1

Si el patrón interior .gitignoretermina con una barra inclinada /, solo encontrará una coincidencia con un directorio.

En otras palabras, bin/coincidirá con un directorio biny rutas debajo de él, pero no coincidirá con un archivo normal o un enlace simbólico bin.


Si el patrón no contiene una barra oblicua , como en binGit, lo trata como un patrón de globo (codicioso). Así que lo mejor sería usar simple /bin.

bin No sería la mejor solución para este problema en particular.

prosti
fuente
¿Quiso decir 'comenzar con' a /?
vineeshvs
0

En mi caso, la codificación del archivo gitignore fue problemática, verifique si es UTF-8

Jacek Plesnar
fuente