Git Hooks

``

Documentación y Recursos

Conceptos Clave

  • Git Hooks: Scripts que se ejecutan automáticamente en respuesta a ciertos eventos en el repositorio de Git, como commits, merges o push.
  • Tipos de Hooks:
    • Client-side Hooks: Se ejecutan en el cliente donde ocurre la acción (por ejemplo, pre-commit, prepare-commit-msg, commit-msg, post-commit).
    • Server-side Hooks: Se ejecutan en el servidor de Git, útiles para controlar pushes o actualizaciones (por ejemplo, pre-receive, update, post-receive).
  • Usos Comunes:
    • Validar mensajes de commit.
    • Ejecutar tests automáticamente antes de un commit o push.
    • Formatear código antes de guardar cambios.
    • Integrar herramientas de CI/CD y análisis de calidad de código.
    • Automatizar tareas repetitivas de desarrollo.

Ejemplos de Hooks

pre-commit

#!/bin/sh
# Evita commits si hay errores de lint
npm run lint
if [ $? -ne 0 ]; then
  echo "Lint errors found. Commit aborted."
  exit 1
fi

`

commit-msg

#!/bin/sh
# Valida que el mensaje de commit siga el patrón de convenciones
commit_regex='^feat|fix|docs|style|refactor|test|chore: .+$'
if ! grep -qE "$commit_regex" "$1"; then
  echo "Error: commit message does not follow convention"
  exit 1
fi

post-commit

#!/bin/sh
# Enviar notificación después del commit
echo "Commit realizado con éxito: $(git log -1 --pretty=%B)"

Herramientas y Mejoras

  • git-commit-enhancer: Hook automático que captura el commit original y lo mejora usando Gemini API.
  • Integración con linters, formateadores y pruebas unitarias para garantizar calidad antes del push.
  • Scripts personalizados según el flujo de trabajo del equipo o proyecto.

Buenas Prácticas

  • Versionar hooks dentro del repositorio (.githooks) y usar core.hooksPath para que todos los desarrolladores los tengan consistentes.
  • Mantener hooks ligeros para no afectar el flujo de trabajo.
  • Documentar cada hook y su propósito.
  • Priorizar hooks client-side para validaciones preventivas y server-side para reglas críticas.

Git Hooks - Avanzado

Tipos Avanzados de Hooks

  • Client-side Hooks (ya mencionados) se pueden detallar:
    • pre-rebase: Se ejecuta antes de un rebase, útil para prevenir conflictos y mantener commits limpios.
    • pre-push: Valida cambios antes de enviar al remoto, ejecutando tests o análisis de seguridad.
    • prepare-commit-msg: Modifica o preconfigura mensajes de commit automáticamente.
  • Server-side Hooks (ya mencionados) con casos de uso:
    • pre-receive: Previene push si no cumple políticas del repositorio (ej: tests fallidos, rama protegida).
    • update: Similar a pre-receive, pero específico para cada rama.
    • post-receive: Puede disparar integraciones CI/CD, despliegues automáticos o notificaciones.

Integraciones y Automatización

  • CI/CD Hooks: Integración con herramientas como GitHub Actions, GitLab CI, Jenkins.
  • Automatización de commits:
    • Añadir información automática sobre el autor, fecha o ticket asociado.
    • Formatear mensajes según convenciones internas del equipo.
  • Seguridad y calidad de código:
    • Validación de vulnerabilidades antes del push.
    • Enforcear reglas de branch o protección de ramas.

Ejemplos Avanzados de Hooks

pre-push

#!/bin/sh
# Ejecutar tests antes de hacer push
npm test
if [ $? -ne 0 ]; then
  echo "Tests fallidos. Push cancelado."
  exit 1
fi

`

pre-rebase

#!/bin/sh
# Evitar rebase si hay cambios locales no comprometidos
if ! git diff-index --quiet HEAD --; then
  echo "Cambios locales detectados. Guarda o commitea antes de rebase."
  exit 1
fi

post-receive

#!/bin/sh
# Desplegar automáticamente al servidor de staging
while read oldrev newrev refname
do
  if [ "$refname" = "refs/heads/main" ]; then
    echo "Desplegando cambios en main a staging..."
    ./deploy_staging.sh
  fi
done

Herramientas Complementarias

  • git-commit-enhancer: Mejora automática de mensajes de commit usando IA.
  • Husky: Facilita la gestión de hooks en proyectos Node.js.
  • Lint-staged: Ejecuta linters solo sobre archivos staged para mejorar velocidad y eficiencia.
  • Integración con análisis estático de código como ESLint, Prettier, Pylint, Checkstyle.

Buenas Prácticas Avanzadas

  • Mantener todos los hooks versionados y en un directorio centralizado (.githooks).
  • Usar hooks client-side para prevención y server-side para reglas críticas.
  • Documentar cada hook y su objetivo.
  • Combinar hooks con pipelines CI/CD para mayor seguridad y consistencia.
  • Revisar periódicamente los hooks para adaptarlos a nuevas necesidades del equipo o proyecto.

Git Hooks - Ejemplos Prácticos y Casos de Uso

Conceptos Clave

  • Git Hooks: Scripts automáticos que se ejecutan ante eventos en Git (commits, push, merge, rebase, etc.).
  • Tipos de Hooks:
    • Client-side: Se ejecutan en el equipo del desarrollador (pre-commit, commit-msg, pre-push, pre-rebase, prepare-commit-msg, post-commit).
    • Server-side: Se ejecutan en el servidor remoto (pre-receive, update, post-receive).
  • Usos comunes:
    • Validar mensajes de commit.
    • Ejecutar tests o linters antes de commits/push.
    • Formatear código automáticamente.
    • Integrar automatizaciones CI/CD.
    • Controlar seguridad y políticas de ramas.

Ejemplos Prácticos de Hooks

pre-commit

#!/bin/sh
# Evitar commits con errores de lint
npm run lint
if [ $? -ne 0 ]; then
  echo "Lint errors detected. Commit aborted."
  exit 1
fi

`

Caso de uso real: En proyectos de frontend, asegura que todos los archivos JS/TS cumplen reglas de ESLint antes de commitear.

commit-msg

#!/bin/sh
# Forzar mensajes de commit que sigan convenciones de equipo
regex="^(feat|fix|docs|style|refactor|test|chore): .+$"
if ! grep -qE "$regex" "$1"; then
  echo "Invalid commit message format."
  exit 1
fi

Caso de uso real: Equipos que usan convenciones de Git Commit para generar changelogs automáticos.

pre-push

#!/bin/sh
# Ejecutar pruebas antes de permitir push
npm test
if [ $? -ne 0 ]; then
  echo "Tests failed. Push aborted."
  exit 1
fi

Caso de uso real: Evitar que código roto llegue a la rama principal en proyectos colaborativos.

pre-rebase

#!/bin/sh
# Prevenir rebase con cambios locales no guardados
if ! git diff-index --quiet HEAD --; then
  echo "Local changes detected. Commit or stash before rebasing."
  exit 1
fi

Caso de uso real: Proteger ramas importantes de conflictos o pérdida de cambios durante rebase.

post-commit

#!/bin/sh
# Notificar en Slack después de cada commit
message=$(git log -1 --pretty=%B)
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"Nuevo commit: $message\"}" $SLACK_WEBHOOK_URL

Caso de uso real: Mantener al equipo informado de commits importantes en proyectos distribuidos.

post-receive

#!/bin/sh
# Desplegar automáticamente en staging tras push a main
while read oldrev newrev refname
do
  if [ "$refname" = "refs/heads/main" ]; then
    ./deploy_staging.sh
    echo "Deployment to staging completed."
  fi
done

Caso de uso real: Automatización de despliegues de staging en proyectos de backend o microservicios.

Herramientas Complementarias

  • git-commit-enhancer: Mejora automática de mensajes de commit usando IA.
  • Husky: Facilita la gestión de hooks en proyectos Node.js.
  • Lint-staged: Ejecuta linters solo sobre archivos staged para eficiencia.
  • Integración con pipelines CI/CD, Prettier, ESLint, Pylint, Checkstyle.

Buenas Prácticas

  • Versionar todos los hooks (.githooks) y configurar core.hooksPath.
  • Usar client-side hooks para validaciones preventivas y server-side para reglas críticas.
  • Mantener hooks ligeros para no afectar productividad.
  • Documentar el propósito y funcionamiento de cada hook.
  • Revisar y actualizar periódicamente los hooks según necesidades del proyecto.
  • Combinar hooks con herramientas de CI/CD para automatización completa y seguridad.

Casos de Uso Reales Resumidos

  • Prevenir commits con código que no cumple estándares.
  • Garantizar mensajes de commit consistentes para changelogs automáticos.
  • Ejecutar tests antes de push para proteger ramas principales.
  • Despliegue automático de staging/producción tras push.
  • Notificaciones en Slack, Teams o correo sobre commits y merges importantes.
  • Validación de políticas de ramas y control de accesos mediante hooks server-side.