1. Ignorar una extensión en todo el proyecto
En el .gitignore raíz, coincide con app.log, logs/app.log y src/app.log. * representa cero o más caracteres salvo /; sin barras en el patrón, Git comprueba nombres a cualquier profundidad inferior.
Escribe un patrón por línea. Son patrones Git, no comandos de shell ni expresiones regulares: *.{log,tmp} no es una lista de extensiones.
*.log 2. Limitar el patrón a un directorio
La primera alternativa coincide con logs/app.log pero no con logs/archive/app.log. La segunda coincide con ambas: /**/ permite cero o más directorios intermedios. Ninguna coincide con src/app.log.
Prueba solo una alternativa cada vez. /logs/ puede ocultar archivos anidados al excluir su padre; revisa otras reglas antes de evaluar un comodín.
/logs/*.log/logs/**/*.log 3. Comprobar rutas representativas
Elige una regla, crea los tres archivos sin seguimiento e inspecciona los patrones:
git check-ignore -v -- logs/app.log logs/archive/app.log src/app.logCon /logs/**/*.log deben coincidir las dos rutas bajo logs, pero no src/app.log. Una coincidencia que empieza por ! es una excepción; mantén accesibles sus directorios padres.
¿Por qué ! no conserva un archivo en un directorio ignorado?
Consulta las referencias oficiales para conocer el comportamiento exacto y más detalles: Documentación de Git · Documentación de git check-ignore