guide

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

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ónCoincideNo coincide
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/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 [ ]

El doble asterisco **

** solo tiene un significado especial cuando va junto a una barra.

FormaSignificadoEjemplo
**/foofoo a cualquier profundidadfoo, a/foo, a/b/foo
**/logs/debug.loglogs/debug.log a cualquier profundidadlogs/debug.log, app/logs/debug.log
abc/**todo lo que hay dentro de abcabc/x, abc/x/y (pero no el propio abc)
a/**/bcero o más directorios en medioa/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
RutaResultadoRegla decisiva
build/app.jsIgnorado/build/
src/build/app.jsRastreadoNinguna
logs/server.logIgnorado*.log
logs/important.logRastreado!important.log
docs/api/v1.pdfIgnoradodocs/**/*.pdf
#scratch.mdIgnorado\#scratch.md

Puedes reproducir esta tabla tal cual pegando las reglas y las rutas en la pestaña Probar patrones del generador.

Referencias

← AnteriorQué ignorar y qué confirmar