HDP115

Uso de .gitignore efectivo

Aprende a configurar y utilizar el archivo .gitignore de manera efectiva para excluir archivos y directorios innecesarios de tu repositorio Git, manteniendo tu proyecto limpio y organizado.

CE

Cristian Escalante

Última actualización: 28 de abril de 2025

git
control de versiones
desarrollo
buenas prácticas

Uso de .gitignore efectivo

Aunque ya hemos visto los conceptos básicos de .gitignore en una lección anterior, en esta ocasión profundizaremos en estrategias avanzadas y buenas prácticas para utilizar este archivo de manera más efectiva. Un .gitignore bien configurado es esencial para mantener tu repositorio limpio, eficiente y profesional.

Recordatorio: ¿Qué es .gitignore?

El archivo .gitignore es un archivo de texto que le indica a Git qué archivos y directorios debe ignorar en un proyecto. Cuando Git encuentra un archivo listado en .gitignore, lo excluye del seguimiento, lo que significa que no aparecerá como archivo no rastreado y no será incluido en los commits.

Patrones avanzados de .gitignore

Sintaxis básica (repaso)

# Comentario: esto es ignorado por Git

# Ignorar un archivo específico
archivo.txt

# Ignorar todos los archivos con una extensión
*.log

# Ignorar un directorio completo
node_modules/

Patrones con comodines

# Ignorar todos los archivos .txt en cualquier directorio
**/*.txt

# Ignorar todos los archivos en un directorio específico
logs/*

# Ignorar todos los archivos .txt en el directorio actual, pero no en subdirectorios
/*.txt

# Ignorar archivos que coincidan con un patrón
*~        # Archivos que terminan con ~
.[oa]     # Archivos que terminan con .o o .a

Negación de patrones

Puedes negar un patrón añadiendo un signo de exclamación (!), lo que hace que Git incluya archivos que de otra manera serían ignorados:

# Ignorar todos los archivos .log
*.log

# Pero no ignorar important.log
!important.log

# Ignorar todo dentro del directorio logs
logs/*

# Pero mantener el archivo .gitkeep
!logs/.gitkeep

Directorios vs. Archivos

Es importante entender la diferencia entre ignorar directorios y archivos:

# Ignorar un directorio y todo su contenido
node_modules/

# Ignorar solo archivos específicos dentro de un directorio
logs/*.log    # Ignora archivos .log en logs/, pero no en subdirectorios
logs/**/*.log # Ignora archivos .log en logs/ y todos sus subdirectorios

Estrategias para organizar .gitignore

1. Archivo .gitignore en la raíz del proyecto

El enfoque más común es tener un único archivo .gitignore en la raíz del repositorio:

# Dependencias
node_modules/
vendor/

# Archivos compilados
dist/
build/

# Archivos de entorno
.env
.env.local

# Archivos del sistema
.DS_Store
Thumbs.db

# Archivos de IDE
.idea/
.vscode/
*.sublime-project

2. Múltiples archivos .gitignore

Puedes tener archivos .gitignore en diferentes directorios para aplicar reglas específicas:

# En la raíz: .gitignore global del proyecto
node_modules/
.env

# En src/.gitignore: reglas específicas para el código fuente
*.compiled.js

# En tests/.gitignore: reglas específicas para pruebas
coverage/

3. .gitignore global del sistema

Además de los archivos .gitignore específicos del proyecto, puedes configurar un .gitignore global para tu usuario:

git config --global core.excludesfile ~/.gitignore_global

Este archivo es ideal para patrones que quieres ignorar en todos tus proyectos, como:

# Archivos del sistema operativo
.DS_Store
Thumbs.db
desktop.ini

# Archivos temporales de editores
*~
.*.swp
.~lock.*

# Archivos de configuración personal de IDEs
.idea/
.vscode/user/

.gitignore por tipo de proyecto

Para proyectos Node.js

# Dependencias
node_modules/
npm-debug.log
yarn-error.log
yarn-debug.log
.pnpm-debug.log

# Cobertura
coverage/

# Producción
build/
dist/
out/

# Entorno
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# Caché
.npm/
.eslintcache
.cache/

Para proyectos Python

# Bytecode compilado
__pycache__/
*.py[cod]
*$py.class

# Distribución / empaquetado
dist/
build/
*.egg-info/
*.egg

# Entornos virtuales
venv/
env/
ENV/
.env/
.venv/
pythonenv*

# Pruebas y cobertura
.coverage
htmlcov/
.pytest_cache/
.tox/

# Jupyter Notebook
.ipynb_checkpoints

Para proyectos Java/Maven

# Archivos compilados
*.class
target/
out/

# Archivos de log
*.log

# Archivos de BlueJ
*.ctxt

# Archivos de Mobile Tools for Java (J2ME)
.mtj.tmp/

# Archivos empaquetados
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Archivos de IDE
.idea/
*.iml
.classpath
.project
.settings/
.vscode/

Para proyectos .NET/C#

# Archivos compilados
bin/
obj/
[Dd]ebug/
[Rr]elease/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio
.vs/
*.user
*.userosscache
*.suo
*.userprefs
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings

# NuGet
packages/
*.nupkg

Técnicas avanzadas

Ignorar archivos ya rastreados

Si has añadido un archivo a .gitignore pero Git sigue rastreándolo, es porque ya estaba en el repositorio. Para dejar de rastrearlo:

git rm --cached archivo.txt

Para directorios:

git rm -r --cached directorio/

Depurar problemas con .gitignore

Si un archivo que debería ser ignorado sigue apareciendo, puedes depurar el problema:

git check-ignore -v archivo.txt

Este comando te mostrará qué regla (si hay alguna) está afectando al archivo.

Ignorar archivos localmente sin modificar .gitignore

Si necesitas ignorar archivos específicamente en tu entorno local sin afectar a otros colaboradores, puedes usar el archivo .git/info/exclude:

# Editar el archivo de exclusiones locales
vim .git/info/exclude

# Añadir patrones específicos para tu entorno
mi-archivo-local.txt
config.local.js

Ignorar cambios temporalmente en archivos rastreados

Si necesitas hacer cambios locales en un archivo rastreado pero no quieres incluirlos en commits:

# Ignorar cambios en un archivo específico
git update-index --assume-unchanged config.js

# Para volver a rastrear cambios
git update-index --no-assume-unchanged config.js

O para un caso de uso similar pero con diferente comportamiento:

# Marcar un archivo como "skip worktree"
git update-index --skip-worktree config.js

# Para volver a rastrear
git update-index --no-skip-worktree config.js

Generación automática de .gitignore

Herramientas online

Generación desde línea de comandos

Con curl:

# Generar .gitignore para Node y macOS
curl -sL https://www.toptal.com/developers/gitignore/api/node,macos > .gitignore

Con la CLI de GitHub (si está instalada):

# Crear un nuevo repositorio con un .gitignore para Python
gh repo create mi-proyecto --public --gitignore Python

Buenas prácticas para .gitignore

1. Crea el .gitignore al inicio del proyecto

Es mucho más fácil configurar correctamente el .gitignore antes de comenzar a trabajar que limpiar un repositorio después.

2. Incluye solo lo necesario en el repositorio

Un buen principio es incluir solo los archivos que son estrictamente necesarios para que el proyecto funcione. Todo lo demás debería ser ignorado.

3. Categoriza y comenta tu .gitignore

Organiza tu .gitignore en secciones con comentarios para facilitar su mantenimiento:

# Dependencias
node_modules/
vendor/

# Archivos compilados
dist/
build/

# Archivos de entorno
.env
.env.*
!.env.example

4. Mantén un archivo .env.example

Para proyectos que utilizan variables de entorno, incluye un archivo .env.example con la estructura pero sin valores sensibles:

# .gitignore
.env
.env.*
!.env.example

5. Utiliza patrones específicos

Evita patrones demasiado generales que podrían ignorar archivos importantes:

# ❌ Demasiado general, podría ignorar archivos importantes
log/

# ✅ Más específico, solo ignora archivos .log
log/*.log

6. Revisa periódicamente tu .gitignore

A medida que el proyecto evoluciona, revisa y actualiza tu .gitignore para asegurarte de que sigue siendo efectivo.

7. Considera las diferentes plataformas y herramientas

Si tu proyecto se desarrolla en diferentes sistemas operativos o con diferentes herramientas, asegúrate de que tu .gitignore cubra todos los casos.

Patrones comunes que deberías ignorar

Archivos de configuración local

# Configuraciones locales
*.local
config.local.js
settings.local.json

Archivos de caché y temporales

# Caché y archivos temporales
.cache/
tmp/
temp/
*.tmp
*.bak

Archivos de registro y diagnóstico

# Logs y diagnósticos
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

Información sensible

# Información sensible
.env
.env.local
*.pem
*.key
credentials.json

Archivos específicos del sistema operativo

# macOS
.DS_Store
.AppleDouble
.LSOverride
Icon
._*

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msm
*.msp
*.lnk

# Linux
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*

Conclusión

Un archivo .gitignore bien configurado es una herramienta esencial para mantener tu repositorio Git limpio, eficiente y profesional. Al excluir archivos innecesarios, temporales o sensibles, reduces el tamaño del repositorio, evitas conflictos y mejoras la seguridad.

Tómate el tiempo para configurar adecuadamente tu .gitignore al inicio de cada proyecto y actualízalo según sea necesario a medida que el proyecto evoluciona. Utiliza las plantillas disponibles como punto de partida, pero personalízalas según las necesidades específicas de tu proyecto.

Recuerda que un buen .gitignore refleja una comprensión clara de qué archivos son parte del código fuente y cuáles son artefactos generados o configuraciones específicas del entorno. Esta distinción es fundamental para un flujo de trabajo de desarrollo colaborativo y eficiente.

Introducción a Git Hooks
Aprende a utilizar Git Hooks para automatizar tareas, valida...
Uso de git stash para guardar trabajo temporal
Aprende a utilizar el comando git stash para guardar tempora...
Referencias
Git. Git - gitignore Documentation. https://git-scm.com/docs/gitignore
GitHub. GitHub - gitignore Repository. https://github.com/github/gitignore
Scott Chacon and Ben Straub. Pro Git Book - Recording Changes to the Repository. https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#_ignoring

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de Python

Aprende los conceptos básicos de Python

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025