Guía completa de la sintaxis de patrones de .gitignore
Resume con tablas de ejemplo la sintaxis de patrones de gitignore: comentarios, escapes y espacios finales, la negación !, la barra final, el anclaje, los comodines *, ? y [] y las reglas de **.
Cada línea de .gitignore es un patrón. La sintaxis parece similar a los glob del shell, pero el significado cambia mucho según la posición de la barra y la posición de **. Lo que sigue se basa en la documentación oficial de git gitignore(5), y los ejemplos se comprobaron directamente con git 2.50.
Líneas vacías, comentarios y escapes
- Una línea vacía no coincide con nada. Se usa como separador para mejorar la legibilidad.
- Las líneas que empiezan por
#son comentarios. Para ignorar un archivo cuyo nombre empieza por#, antepón una barra invertida, como en\#. - Los espacios al final de la línea se ignoran. Si necesitas un nombre de archivo que termine en espacio, protege el espacio con una barra invertida, como en
foo\. Los espacios al principio de la línea sí forman parte del patrón. - Las líneas que empiezan por
!son patrones de negación. Un archivo cuyo nombre empieza por!se escribe como\!important.txt.
Los espacios finales no se ven y son causa de errores frecuentes. Si una regla no funciona, activa la visualización de espacios en el editor. Recuerda también que solo se eliminan los espacios, no los tabuladores.
Barra final: solo coincide con directorios
Si el patrón termina en /, coincide solo con directorios. build/ ignora el directorio llamado build y todo lo que contiene, pero no un archivo llamado build. En cambio, si se escribe sin barra, como build, coincide tanto con archivos como con directorios de ese nombre.
Si hay una barra, la posición queda fijada
Si, sin contar la barra final, hay una / al principio o en medio del patrón, este solo coincide con la ruta relativa al directorio donde está el .gitignore. Esto se suele llamar anclaje (anchoring). Si no hay /, se buscan elementos con ese nombre a cualquier profundidad por debajo de donde está el .gitignore.
| Patrón | Coincide | No coincide |
|---|---|---|
debug.log | debug.log, logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/logs/debug.log |
doc/frotz/ | directorio doc/frotz/ | a/doc/frotz/ |
frotz/ | directorios frotz/, a/frotz/ | archivo frotz |
La tercera fila es la que más confunde. logs/debug.log tiene una barra en medio, así que queda fijado a la raíz y significa lo mismo que si llevara / delante. Para capturar logs/debug.log a cualquier profundidad, usa **/logs/debug.log.
Comodines: *, ? y [ ]
*coincide con cualquier cadena excepto/(incluida la cadena vacía).*.logcoincide conapp.logy cona/b/app.log, perologs/*.logsolo coincide conlogs/app.logy no conlogs/2026/app.log.?coincide con un carácter que no sea/.file?.txtcoincide confile1.txty no confile10.txt.[a-z]coincide con un carácter dentro del rango, y[!a-z]o[^a-z]con un carácter fuera del rango.*.py[cod]captura.pyc,.pyoy.pydde una vez. Los corchetes tampoco coinciden con/.- También se pueden usar clases de caracteres POSIX como
[[:digit:]].
El doble asterisco **
** solo tiene un significado especial cuando va junto a una barra.
| Forma | Significado | Ejemplo |
|---|---|---|
**/foo | foo a cualquier profundidad | foo, a/foo, a/b/foo |
**/logs/debug.log | logs/debug.log a cualquier profundidad | logs/debug.log, app/logs/debug.log |
abc/** | todo lo que hay dentro de abc | abc/x, abc/x/y (pero no el propio abc) |
a/**/b | cero o más directorios en medio | a/b, a/x/b, a/x/y/b |
En otras posiciones, por ejemplo en foo** o **bar, ** se comporta como un * normal y no atraviesa barras. docs/**/*.pdf coincide tanto con docs/manual.pdf como con docs/a/b/manual.pdf, porque /**/ también coincide con cero directorios.
Un ejemplo pequeño para resumir
# Resultados de compilación (solo el directorio build de la raíz)
/build/
# Archivos de registro a cualquier profundidad, pero se conserva el importante
*.log
!important.log
# Todos los PDF bajo docs
docs/**/*.pdf
# Archivo cuyo nombre empieza por #
\#scratch.md
| Ruta | Resultado | Regla decisiva |
|---|---|---|
build/app.js | Ignorado | /build/ |
src/build/app.js | Rastreado | Ninguna |
logs/server.log | Ignorado | *.log |
logs/important.log | Rastreado | !important.log |
docs/api/v1.pdf | Ignorado | docs/**/*.pdf |
#scratch.md | Ignorado | \#scratch.md |
Puedes reproducir esta tabla tal cual pegando las reglas y las rutas en la pestaña Probar patrones del generador.
Referencias
- Documentación oficial de gitignore (git-scm.com)
- GitHub Docs: Ignoring files
- Fecha de verificación: 2026-09-23 (ejemplos comprobados con git 2.50.1)