2009-07-06 14 views

Respuesta

19

Trate de añadir estas líneas a su archivo .gitignore:

src/*/bin 
src/*/obj 
+0

Simplemente funciona ... Gracias :) –

+0

No funciona para mí con '1.7.0.2.msysgit.0'. Publiqué una respuesta que funciona para mí. –

+0

@Drew: Su respuesta parece más útil ya que coincide con todos los directorios con menos problemas, así que lo voté. Dicho esto, no sé por qué esta respuesta no funcionaría para usted ya que estoy usando esta técnica actualmente sin problema. Tal vez su versión de git es vieja? –

1

creo que debería ser capaz de añadir

src/*/bin/* 

a .gitignore, y cualquier cosa que coincide con el patrón será ignorado.

+1

No funciona para mí con '1.7.0.2.msysgit.0'. –

8

La forma más obvia sería la de añadir estos a src/.gitignore:

obj/ 
bin/ 

Esto pasa por alto los caminos que se encuentran en una la llamada al directorio obj, o un directorio llamado bin desde el directorio src hacia abajo.

Algo así como src/*/obj/ en un nivel superior .gitignore podría no funcionar si tiene una jerarquía de proyectos irregular con algunos obj y bin directorios Más adelante, bajando el árbol.

Aquí está shell script prueba rápida que muestra la regla de ignorar en acción:

#!/bin/sh 
mkdir src 
mkdir tools 

mkdir src/project1 
mkdir src/project2 
mkdir tools/tool1 

mkdir src/project1/bin 
mkdir src/project1/obj 
mkdir src/project2/bin 
mkdir src/project2/obj 
mkdir tools/tool1/bin 

touch testfile 
touch src/testfile 
touch tools/testfile 
touch src/project1/testfile 
touch src/project2/testfile 
touch tools/tool1/testfile 
touch src/project1/bin/testfile 
touch src/project1/obj/testfile 
touch src/project2/bin/testfile 
touch src/project2/obj/testfile 
touch tools/tool1/bin/testfile 

git init 

add_empty() { touch "$1" && git add "$1"; } 

add_empty dummy 
add_empty src/dummy 
add_empty tools/dummy 
add_empty src/project1/dummy 
add_empty src/project2/dummy 
add_empty tools/tool1/dummy 

git status 

printf 'obj/\nbin/\n' >src/.gitignore && git add src/.gitignore 

git status 

La sección de archivos sin seguimiento del primer estado es:

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/bin/ 
#  src/project1/obj/ 
#  src/project1/testfile 
#  src/project2/bin/ 
#  src/project2/obj/ 
#  src/project2/testfile 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 

y después de agregar el archivo .gitignore:

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/testfile 
#  src/project2/testfile 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 

Como prueba para demostrar que git no está ignorando los archivos llamados.210 y bin pero es ignorar obj y bin directorios más abajo en la jerarquía después de ejecutar este script:

#!/bin/sh 
mkdir src/project3 
touch src/project3/testfile && git add src/project3/testfile 
touch src/project3/obj 
touch src/project3/bin 

mkdir src/subdir 
mkdir src/subdir/proj 
touch src/subdir/proj/testfile && git add src/subdir/proj/testfile 
mkdir src/subdir/proj/obj 
mkdir src/subdir/proj/bin 
touch src/subdir/proj/obj/testfile 
touch src/subdir/proj/bin/testfile 

Los nuevos archivos sin seguimiento son:

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/testfile 
#  src/project2/testfile 
#  src/project3/bin 
#  src/project3/obj 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 
+0

No estoy seguro de que funcione para todas las profundidades. Tuve problemas con esos patrones aquí: http://stackoverflow.com/questions/991801/git-ignores-and-maven-targets/991873#991873 (y también verifique el enlace en el comentario de esa respuesta) – VonC

+0

Si no lo hace 't, es un error. La barra inclinada significa 'unir como un directorio solamente', después de eso se trata como un patrón sin una barra inclinada (se elimina la barra inclinada), por lo que se utiliza como un archivo glob normal y se combinará en cualquier lugar. No estoy seguro de dónde viene el '**', ya que no es una sintaxis que git admita. –

+0

Apéndice, específicamente necesita una barra diagonal * * para anclar la coincidencia del directorio actual, pero ese no es el caso aquí, lo queremos en cualquier lugar debajo de un directorio, no 'anclado' en un directorio. –

16

La respuesta aceptada no funcionó para mí.

> git --version 
git version 1.7.0.2.msysgit.0 

Parece que las barras diagonales no funcionan con msysgit en el archivo .gitignore. Esto funciona.

*\bin 
*\obj 

obstante que coincidirá excluye cualquier archivo llamado binobj o también, que no es probable que sea un problema, excepto cuando se trata.A continuación se evita esto (y sí, una barra inclinada funciona en este caso):

bin/ 
obj/ 
*.user 
*.suo 

Esto coincide con los archivos a diferentes profundidades en la jerarquía debajo de la carpeta en la que se coloca el archivo .gitignore. Tenga en cuenta que lo anterior no funcionó cuando incluí un prefijo para una subcarpeta específica, por lo que lo coloqué en mi carpeta Source directamente.

Como usuario de Visual Studio (probablemente el OP también pertenece a la referencia bin/obj), también es bueno excluir los archivos .user y .suo.


Desde el gitignore specification:

patrones tienen el siguiente formato:

  • Una línea en blanco coincide con ningún archivo, por lo que puede servir como un separador para facilitar la lectura.

  • Una línea que comienza con # sirve como comentario.

  • ¡Un prefijo opcional! que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente. Si un patrón negado coincide, esto anulará las fuentes de patrones de precedencia inferiores.

  • Si el patrón termina con una barra inclinada, se elimina a los fines de la siguiente descripción, pero solo encontraría una coincidencia con un directorio. En otras palabras, foo/coincidirá con un directorio foo y rutas debajo de él, pero no coincidirá con un archivo regular o un enlace simbólico foo (esto es consistente con la forma en que pathspec trabaja en general en git).

  • Si el patrón no contiene una barra inclinada, git lo trata como un patrón de caparazón glob y comprueba si hay una coincidencia con la ruta del archivo .gitignore (relativo al nivel del árbol de trabajo si no de un archivo .gitignore).

  • De lo contrario, git trata el patrón como un comodín adecuado para el consumo por fnmatch (3) con el indicador FNM_PATHNAME: los comodines en el patrón no coincidirán con a/en el nombre de ruta. Por ejemplo, "Documentation/*. Html" coincide con "Documentation/git.html" pero no con "Documentation/ppc/ppc.html" o "tools/perf/Documentation/perf.html".

  • Una barra diagonal inicial coincide con el comienzo de la ruta de acceso. Por ejemplo, "/*.c" coincide con "cat-file.c" pero no con "mozilla-sha1/sha1.c".

+0

¡Eres un héroe! – asgerhallas

+0

bin/ obj/ * * .user .suo funcionó a la perfección .. gracias – kpasgma

+0

bin/obj/* * .user .suo es lo que desea, si las extensiones de Git no una vista previa no se preocupe que acaba de agregar a su nivel superior .gitignore de todos modos :) –

2

La confusión para mí fue que una vez añadido, cualquiera que sea la máscara se pone en él, los archivos permanecerán en el repositorio si no son retiradas por la fuerza, por lo que después de haber añadido una solución de Visual Studio prima, compilado, tuve que limpiar la expedición repositorio:

git rm --cached */obj/* 
git rm --cached */lib/* 
git rm --cached *.user 
git rm --cached *.suo 
git rm --cached *ReSharper 

entonces, añadido este a .gitignore:

*/*/bin 
*/*/obj 
*.user 
*.suo 
*ReSharper* 

entonces comprometido:

git add . 
git commit -m "removed user files and binaries from repository" 
Cuestiones relacionadas