Automatización y personalización
Git no solo es una herramienta poderosa para el control de versiones, sino que también ofrece una gran flexibilidad para automatizar tareas y personalizar el flujo de trabajo de un proyecto. Con la ayuda de aliases, hooks, integración con CI/CD, y archivos de configuración como .gitignore y .gitattributes, puedes hacer que tu experiencia con Git sea más eficiente y organizada.
1. Alias en Git #
Los aliases en Git permiten crear atajos personalizados para comandos de uso frecuente o combinaciones complejas de comandos. Esto no solo ahorra tiempo, sino que también hace que tu flujo de trabajo sea más fluido.
Crear un alias en Git #
Puedes definir un alias con el comando git config. Los aliases se almacenan en el archivo de configuración de Git (.gitconfig) y pueden ser configurados a nivel global o local (por repositorio).
- Uso:
1git config --global alias.<alias> "<comando>"
Ejemplos de alias útiles #
-
Alias para
git status:1git config --global alias.st "status"Ahora puedes ejecutar
git sten lugar degit status. -
Alias para
git log --oneline --graph --decorate(ver un historial gráfico simplificado):1git config --global alias.lg "log --oneline --graph --decorate --all"Este alias te muestra un historial de commits en formato gráfico con una sola línea por commit.
-
Alias para añadir todos los archivos y hacer commit:
1git config --global alias.ac "!git add . && git commit -m"Este alias permite añadir todos los archivos modificados y hacer commit con un solo comando.
Ver los alias configurados #
Para ver los aliases configurados, puedes usar el comando:
1git config --global --get-regexp alias
2. Hooks de Git para automatizar tareas #
Git hooks son scripts que se ejecutan automáticamente en ciertos eventos del ciclo de vida de Git, como antes o después de un commit, o cuando se empujan cambios al repositorio remoto. Los hooks permiten automatizar tareas repetitivas o críticas, como ejecutar pruebas, verificar estilo de código o impedir commits incorrectos.
Tipos de hooks #
- Hooks del lado del cliente: Se ejecutan en eventos locales, como
commit,merge, ocheckout. - Hooks del lado del servidor: Se ejecutan en eventos relacionados con un repositorio remoto, como
pre-receive,updateypost-receive.
Ejemplos de hooks comunes #
-
pre-commit: Se ejecuta antes de que un commit sea guardado. Puedes usarlo para verificar el estilo del código o correr pruebas automáticas.-
Ejemplo: Un
pre-commitque ejecuta ESLint antes de cada commit:- Crear el archivo
.git/hooks/pre-commit:1#!/bin/sh 2npm run lint
- Crear el archivo
-
Asegúrate de que el script sea ejecutable:
1chmod +x .git/hooks/pre-commit
-
-
post-merge: Se ejecuta después de que una fusión (merge) ha tenido éxito. Puedes usarlo para realizar tareas como actualizar dependencias.- Ejemplo: Un
post-mergeque ejecutanpm install:1#!/bin/sh 2npm install
- Ejemplo: Un
Crear y compartir hooks personalizados #
Los hooks locales se almacenan en .git/hooks/ (que no se sube al repositorio). Para compartir hooks con todo el equipo de desarrollo:
- Puedes versionar tus scripts en una carpeta del proyecto (por ejemplo,
.githooks/o herramientas como Husky). - Configurar Git para usar esa ruta compartida:
1git config core.hooksPath .githooks
3. Integración con CI/CD (GitHub Actions, GitLab CI) #
La integración continua (CI) y la entrega continua (CD) son prácticas fundamentales en el desarrollo moderno de software. Con Git, puedes automatizar el proceso de construcción, prueba y despliegue de tu código utilizando herramientas como GitHub Actions y GitLab CI.
GitHub Actions #
GitHub Actions permite definir flujos de trabajo automáticos directamente en tu repositorio. Estos flujos se ejecutan en respuesta a eventos como commits o pull requests.
-
Crear un archivo de flujo de trabajo:
-
Los flujos de trabajo se definen en archivos
.ymldentro del directorio.github/workflows/. -
Ejemplo de un flujo de trabajo simple para ejecutar pruebas:
- Crea el archivo
.github/workflows/ci.yml:1name: CI Workflow 2 3on: 4 push: 5 branches: 6 - main 7 pull_request: 8 branches: 9 - main 10 11jobs: 12 test: 13 runs-on: ubuntu-latest 14 steps: 15 - uses: actions/checkout@v4 16 - name: Configurar Node.js 17 uses: actions/setup-node@v4 18 with: 19 node-version: 20 20 - name: Instalar dependencias 21 run: npm install 22 - name: Ejecutar pruebas 23 run: npm test
- Crea el archivo
Este flujo se ejecuta cada vez que se empuja un cambio o se abre una PR a la rama
main. Realiza las siguientes tareas:- Clona el repositorio con la acción oficial moderna
actions/checkout@v4. - Configura el entorno de ejecución Node.js.
- Instala las dependencias y ejecuta las pruebas automatizadas.
-
GitLab CI #
GitLab CI usa un archivo llamado .gitlab-ci.yml para definir los pasos del flujo de trabajo.
-
Crear un archivo de configuración para GitLab CI:
-
Crea el archivo
.gitlab-ci.ymlen el directorio raíz del repositorio. -
Ejemplo de configuración:
1stages: 2 - build 3 - test 4 5build_job: 6 stage: build 7 script: 8 - npm install 9 10test_job: 11 stage: test 12 script: 13 - npm test
Este archivo define dos etapas (
stages):buildytest. En la etapabuild, se instalan las dependencias, y en la etapatest, se ejecutan las pruebas. -
4. Uso de .gitignore para gestionar archivos no deseados #
El archivo .gitignore es utilizado para indicarle a Git qué archivos o directorios no debe incluir en el control de versiones. Es útil para excluir archivos temporales, binarios o configuraciones locales que no deberían ser compartidos en el repositorio.
Ejemplo básico de .gitignore #
1# Ignorar archivos de sistema 2.DS_Store 3 4# Ignorar archivos compilados 5*.log 6*.o 7*.out 8 9# Ignorar directorio de dependencias de Node.js 10node_modules/ 11 12# Ignorar archivos de configuración local 13.env
Ubicación del archivo .gitignore #
- El archivo
.gitignorese coloca en el directorio raíz del proyecto. - Puedes tener varios
.gitignoreen diferentes subdirectorios si necesitas reglas más específicas.
Ignorar archivos ya versionados #
Si deseas ignorar archivos que ya están siendo rastreados por Git, primero debes eliminarlos del seguimiento:
1git rm --cached <archivo>
Luego, añádelo a .gitignore para que no vuelva a ser rastreado en futuros commits.
5. Configuración de .gitattributes para controlar atributos de archivos #
El archivo .gitattributes permite definir cómo Git debe manejar archivos específicos dentro del repositorio. Se utiliza para controlar la normalización de los saltos de línea, el tratamiento de archivos binarios, la combinación automática y más.
Funciones principales de .gitattributes #
-
Control de saltos de línea (line endings):
- Puedes definir cómo Git debe manejar los saltos de línea (CRLF o LF) para diferentes archivos:
1*.txt text eol=lf 2*.bat text eol=crlf
- Puedes definir cómo Git debe manejar los saltos de línea (CRLF o LF) para diferentes archivos:
-
Definir archivos binarios:
- Para evitar que Git intente hacer "diff" o fusiones en archivos binarios, puedes marcarlos como tales:
1*.jpg binary 2*.png binary
- Para evitar que Git intente hacer "diff" o fusiones en archivos binarios, puedes marcarlos como tales:
-
Fusionar archivos de forma personalizada:
- Puedes definir cómo deben ser fusionados ciertos archivos durante una fusión (
merge). Por ejemplo, podrías preferir una estrategia de fusión manual para ciertos tipos de archivos:1*.md merge=manual
- Puedes definir cómo deben ser fusionados ciertos archivos durante una fusión (
-
Almacenamiento de archivos grandes con Git LFS:
- Si usas Git Large File Storage (LFS) para manejar archivos grandes, puedes configurarlo en
.gitattributes:1*.psd filter=lfs diff=lfs merge=lfs -text
- Si usas Git Large File Storage (LFS) para manejar archivos grandes, puedes configurarlo en
Resumen del tema
Conceptos clave #
- Aliases de Git (
git config --global alias.<nombre>): atajos personalizados para simplificar comandos largos (ej.alias.lg "log --oneline --graph --decorate --all"). - Git Hooks (
.git/hooks/): scripts ejecutables locales (cliente) o remotos (servidor) disparados por eventos (pre-commitpara linters/tests,post-mergepara dependencias). - Pipelines CI/CD (GitHub Actions / GitLab CI): automatización de integración, pruebas y despliegues basada en YAML ante eventos de push o pull request.
- Gestión de Archivos con
.gitignorey.gitattributes:.gitignore: exclusión de archivos generados, dependencias (node_modules/) y secretos (.env).git rm --cached <archivo>: desvincula del seguimiento un archivo ya commiteado..gitattributes: normalización de saltos de línea (eol=lf), definición de binarios y filtros LFS.
Qué debes recordar #
Automatizar la calidad mediante hooks y CI/CD junto con un archivo .gitignore estricto mantiene el repositorio limpio, seguro y profesional.