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
-
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/hooksCada hook se debe configurar manualmente por repositorio
-
Crear el archivo de script:
Abre tu editor de texto y crea un nuevo archivo llamado
commit-msg
en el directorio de hooks. -
Copia el siguiente script en el archivo
commit-msg
:#!/bin/sh# Obtener el archivo del mensaje de commitCOMMIT_MSG_FILE="$1"# Leer el mensaje de commitCOMMIT_MSG="$(cat "$COMMIT_MSG_FILE")"# Verificar si el mensaje de commit ya tiene el formatoif echo "$COMMIT_MSG" | grep -qE '^\[[A-Za-z0-9_-]+\]'; then# El mensaje ya tiene el formato deseado, no hacer nadaexit 0fi# Obtener el nombre de la rama actualBRANCH_NAME="$(git symbolic-ref --short HEAD 2>/dev/null)"# Verificar si se pudo obtener el nombre de la ramaif [ -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 partesif [ "${#PARTS[@]}" -ge 2 ]; then# Construir el TICKET_NUMBER con las dos primeras partesTICKET_NUMBER="${PARTS[0]}-${PARTS[1]}"# Preceder el TICKET_NUMBER al mensaje de commitecho "[$TICKET_NUMBER] $COMMIT_MSG" > "$COMMIT_MSG_FILE"else# Si no hay al menos dos partes, no modificar el mensajeecho "$COMMIT_MSG" > "$COMMIT_MSG_FILE"fififiGuarda los cambios en el archivo.