Skip to content

Git hooks

Un Git hook es un script que Git ejecuta automáticamente antes o después de eventos específicos, como hacer un commit, un push o recibir cambios en un repositorio. Los hooks permiten automatizar tareas en el flujo de trabajo de Git, como verificar la calidad del código, realizar pruebas, actualizar dependencias, o, como en nuestro caso, modificar los mensajes de commit para cumplir con una convención establecida.

Tipos de Git Hooks

Los hooks se dividen en dos categorías principales:

  • Hooks del lado del cliente:

    • pre-commit: Se ejecuta antes de que un commit se realice. Útil para verificar el estado del código.
    • prepare-commit-msg: Se ejecuta antes de que se muestre el mensaje del commit. Puede modificar el mensaje antes de que el usuario lo edite.
    • commit-msg: Se ejecuta después de que el usuario haya escrito el mensaje del commit. Permite modificar el mensaje final del commit.
    • post-commit: Se ejecuta después de que se ha realizado un commit. Útil para notificaciones o acciones de seguimiento.
  • Hooks del lado del servidor:

    • pre-receive: Se ejecuta cuando el servidor recibe un push. Puede utilizarse para validar los commits antes de aceptarlos.
    • update: Similar a pre-receive, pero se ejecuta una vez por cada rama que se envía.
    • post-receive: Se ejecuta después de que los cambios se han aceptado. Puede utilizarse para implementar servicios de integración continua o notificaciones.

Crear un githook

Vamos a hacer un githook para estandarizar el mensaje de los commits que añadira una clave de al inicio del mensaje en base a la rama, es decir, si estás en una rama llamada hotfix/BUG-1234 y haces un commit con el mensaje Fix null pointer exception, el mensaje final será:

[BUG-1234] Fix null pointer exception
  1. Navega al directorio de hooks de Git:

    Navega al directorio de hooks de tu repositorio local de Git. Este directorio se encuentra en .git/hooks

    cd path/to/your/repo/.git/hooks

    Cada hook se debe configurar manualmente por repositorio

  2. Crear el archivo de script:

    Abre tu editor de texto y crea un nuevo archivo llamado commit-msg en el directorio de hooks.

  3. Copia el siguiente script en el archivo commit-msg:

    #!/bin/sh
    # Obtener el archivo del mensaje de commit
    COMMIT_MSG_FILE="$1"
    # Leer el mensaje de commit
    COMMIT_MSG="$(cat "$COMMIT_MSG_FILE")"
    # Verificar si el mensaje de commit ya tiene el formato
    if echo "$COMMIT_MSG" | grep -qE '^\[[A-Za-z0-9_-]+\]'; then
    # El mensaje ya tiene el formato deseado, no hacer nada
    exit 0
    fi
    # Obtener el nombre de la rama actual
    BRANCH_NAME="$(git symbolic-ref --short HEAD 2>/dev/null)"
    # Verificar si se pudo obtener el nombre de la rama
    if [ -n "$BRANCH_NAME" ]; then
    # Verificar si el nombre de la rama contiene una '/'
    if echo "$BRANCH_NAME" | grep -q '/'; then
    # Extraer la parte después del último '/'
    BRANCH_PART="${BRANCH_NAME##*/}"
    # Extraer los componentes separados por '-'
    IFS='-' read -r -a PARTS <<< "$BRANCH_PART"
    # Verificar que haya al menos dos partes
    if [ "${#PARTS[@]}" -ge 2 ]; then
    # Construir el TICKET_NUMBER con las dos primeras partes
    TICKET_NUMBER="${PARTS[0]}-${PARTS[1]}"
    # Preceder el TICKET_NUMBER al mensaje de commit
    echo "[$TICKET_NUMBER] $COMMIT_MSG" > "$COMMIT_MSG_FILE"
    else
    # Si no hay al menos dos partes, no modificar el mensaje
    echo "$COMMIT_MSG" > "$COMMIT_MSG_FILE"
    fi
    fi
    fi

    Guarda los cambios en el archivo.