Haga que .gitignore ignore todo excepto algunos archivos

Resuelto Andrew asked hace 15 años • 31 respuestas

Entiendo que un .gitignorearchivo oculta archivos específicos del control de versiones de Git.

¿Cómo le digo .gitignoreque ignore todo excepto los archivos que estoy rastreando con Git? Algo como:

# Ignore everything:
*

# Do not ignore these files:
script.pl
template.latex
Andrew avatar Jun 12 '09 22:06 Andrew
Aceptado

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 menor precedencia.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*
Joakim Elofsson avatar Jun 12 '2009 15:06 Joakim Elofsson

Si desea ignorar todo el contenido de un directorio excepto un archivo dentro de él, puede escribir un par de reglas para cada directorio en la ruta del archivo. Por ejemplo .gitignore, ignorar la pippocarpeta excepto la depippo/pluto/paperino.xml

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

Tenga en cuenta que /*es necesario para las carpetas. Lo siguiente no funcionará:

folder
!folder/some-file.txt

pero sólo esto:

folder/*
!folder/some-file.txt

Tenga en cuenta que si simplemente hubiera escrito arriba:

pippo/*
!pippo/pluto/paperino.xml

No funcionaría porque la plutocarpeta intermedia no existiría en Git, por lo que paperino.xmlno podría encontrar un lugar donde existir.

Giuseppe Galano avatar May 01 '2013 12:05 Giuseppe Galano

Desea utilizar /*en lugar de *o */en la mayoría de los casos

El uso *es válido, pero funciona de forma recursiva. A partir de ese momento no buscará en directorios. La gente recomienda !*/volver a incluir directorios en la lista, pero en realidad es mejor incluir en la lista bloqueada la carpeta de nivel más alto con/*

# Blocklist files/folders in same directory as the .gitignore file
/*

# Includelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Includelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

El código anterior ignoraría todos los archivos excepto .gitignore, README.md, y todo lo contenido en esas folder/a/file.txtdos últimas carpetas. (Y los archivos se ignorarían en esas carpetas).folder/a/b1/folder/a/b2/.DS_Store*.log

Obviamente podría hacer, por ejemplo, !/foldero !/.gitignoretambién.

Más información: http://git-scm.com/docs/gitignore

Ryan Taylor avatar Apr 29 '2015 00:04 Ryan Taylor

Un poco más específico:

Ejemplo: ignorar todo lo que aparece webroot/cache, pero conservarlo webroot/cache/.htaccess.

Observe la barra diagonal (/) después de la cachecarpeta:

FALLA

webroot/cache*
!webroot/cache/.htaccess

OBRAS

webroot/cache/*
!webroot/cache/.htaccess
Nik avatar Aug 13 '2013 13:08 Nik

¡Herramientamos!

Como dijo @Joakim, para ignorar un archivo, puedes usar algo como lo siguiente.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

pero si el archivo está en directorios anidados, es un poco difícil escribir esas reglas.

Por ejemplo, si queremos omitir todos los archivos pero no los a.txt, ubicados en aDir/anotherDir/someOtherDir/aDir/bDir/cDir. Entonces, nuestro .gitignoreserá algo como esto.

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Esto es bastante difícil de escribir a mano.

Para resolver este obstáculo, creé una aplicación web llamada git-do-not-ignore que generará las reglas por usted.

Herramienta

  • https://theapache64.github.io/git-do-not-ignore/

Manifestación

Entrada de muestra

aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Salida de muestra

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt
theapache64 avatar Feb 25 '2019 15:02 theapache64
# ignore these
*
# except foo
!foo
S.P avatar Jun 12 '2009 15:06 S.P