Alejandría

Busca en Alejandría

Técnicas

Pre-commit hooks

Detecta errores y secretos antes de crear un commit.

01

En pocas palabras

Comprobaciones locales que Git ejecuta antes de crear un commit y que pueden detenerlo si detectan problemas.

Qué problema resuelve

Inclusión accidental de secretos y errores sencillos, con retroalimentación inmediata.

Cuándo utilizarlo

Repositorios de aplicaciones, infraestructura y código generado con IA. Ejemplo: detectar una credencial en los archivos preparados para el commit y bloquearlo.

02

De la idea a la práctica

Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.

Cómo funciona

Git ejecuta el hook pre-commit antes de crear el commit. Si termina con un código distinto de cero, detiene la operación. Un gestor de hooks puede distribuir su configuración y facilitar la instalación en cada equipo.

Ejemplo: seleccionar controles útiles

Ejecuta análisis de secretos y comprobaciones rápidas sobre los archivos preparados. Si encuentra un token, el mensaje debe señalar el archivo y permitir corregirlo antes de volver a intentar el commit.

Reserva pruebas de integración, análisis largos y construcciones completas para CI o una ejecución explícita. El objetivo es una respuesta breve y accionable en el momento de guardar el cambio.

Configuración con el framework pre-commit

# .pre-commit-config.yaml (actualiza las versiones con `pre-commit autoupdate`)
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-merge-conflict
      - id: check-added-large-files
        args: ['--maxkb=500']
      - id: detect-private-key
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.24.0
    hooks:
      - id: gitleaks
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.12.0
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format
  - repo: local
    hooks:
      - id: conventional-commit
        name: Mensaje con Conventional Commits
        entry: ./scripts/validar-mensaje.sh
        language: script
        stages: [commit-msg]
pre-commit install --hook-type pre-commit --hook-type commit-msg
pre-commit run --all-files      # en CI o tras añadir un hook nuevo

Cada hook se instala en un entorno aislado con la versión fijada, por lo que todas las personas ejecutan exactamente lo mismo.

Herramientas según el ecosistema

Herramienta Encaja en
pre-commit Proyectos políglotas, hooks de la comunidad
Husky + lint-staged Proyectos JavaScript/TypeScript
Lefthook Cualquier lenguaje, binario único y ejecución en paralelo
prek Reimplementación rápida compatible con la configuración de pre-commit

Qué poner y qué no

Sí (segundos) No (mejor en CI)
Formateo de los archivos modificados Suite completa de pruebas
Detección de secretos Builds completos y análisis largos
Linters rápidos sobre archivos en el stage Escaneo de todas las dependencias
Validación de YAML, JSON y conflictos sin resolver Pruebas de integración
Formato del mensaje de commit Despliegues

Si un hook tarda más de unos pocos segundos, la gente usará --no-verify y el control desaparecerá en la práctica.

Secretos: la razón principal

Un secreto que llega a un commit queda en el historial aunque se borre después, y si se hace push, debe considerarse comprometido y rotarse. El hook local evita la mayoría de los casos; el escaneo en el servidor (push protection de GitHub o GitLab, o Gitleaks en CI) cubre a quien no tenga los hooks instalados. Los agentes de código también hacen commits: los mismos hooks los protegen (feedback sensors).

Criterios de implementación

Versiona la configuración y documenta cómo instalarla. Comprueba los archivos del índice de Git, no solo el directorio de trabajo. Repite en CI los controles obligatorios, ya que los hooks locales pueden omitirse.

Continúa en las fuentes

Documentación oficial para verificar detalles y explorar más.