Haga que .gitignore ignore todo excepto algunos archivos
Entiendo que un .gitignore
archivo oculta archivos específicos del control de versiones de Git.
¿Cómo le digo .gitignore
que ignore todo excepto los archivos que estoy rastreando con Git? Algo como:
# Ignore everything:
*
# Do not ignore these files:
script.pl
template.latex
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/*
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 pippo
carpeta 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 pluto
carpeta intermedia no existiría en Git, por lo que paperino.xml
no podría encontrar un lugar donde existir.
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.txt
dos ú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, !/folder
o !/.gitignore
también.
Más información: http://git-scm.com/docs/gitignore
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 cache
carpeta:
FALLA
webroot/cache*
!webroot/cache/.htaccess
OBRAS
webroot/cache/*
!webroot/cache/.htaccess
¡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 .gitignore
será 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
# ignore these
*
# except foo
!foo