0
(0)

Git es una herramienta brillante. Le permite no solo realizar un seguimiento de sus cambios en un archivo a través de enlaces, sino también colaborar sin problemas con otras personas. En ese sentido, Git es una herramienta que impulsó el desarrollo de FOSS.

Sin embargo, uno de los mayores problemas con Git es que lleva tiempo y esfuerzo administrar sus repositorios. Por ejemplo, confirmar y sincronizar estos repositorios puede requerir de dos a tres comandos de git. Esto hace que administrarlos no solo sea tedioso sino también propenso a errores del usuario. Aquí le mostramos algunos ganchos de Git simples pero efectivos para administrar mejor sus repositorios.

Nota: yTambién puede administrar Git en Emacs. ¡Aprender cómo!

¿Qué son los ganchos Git?

En esencia, git-hook es un subcomando flexible que puede usar para crear scripts personalizados que se ejecutan cada vez que Git realiza una acción en un repositorio. Por ejemplo, es posible usar hook para verificar automáticamente su repositorio en busca de errores de estilo incluso antes de comprometerse con él.

5 Git Hooks 02 Ejemplo LinterFuente de imagen: jslint

El subcomando hook funciona leyendo la carpeta «hooks» en el directorio «.git» de tu repositorio. Esta carpeta contiene una serie de archivos prefabricados que proporcionan un script de muestra para cada acción en Git que puede automatizar.

5 Git Hooks 03 Directorio de Hooks por defecto

En su mayor parte, puede escribir un git hook en cualquier lenguaje de secuencias de comandos que desee. Esto lo hace increíblemente flexible y accesible para cualquier desarrollador de software.

Propina: para comenzar con Git, primero deberá configurar el nombre de usuario y el correo electrónico de Git. Descubre cómo en esta guía.

1. Evite presionar para dominar

Uno de los errores más comunes que comete un usuario en Git es enviar una confirmación desde una rama de desarrollo directamente al maestro. Esto puede ser increíblemente frustrante si usa Github para rastrear y mantener sus proyectos.

5 Git Hooks 04 Ejemplo Git Push

Puede evitar este problema creando un gancho de Git «pre-empujado» que verificará y confirmará cada vez que intente empujar un repositorio desde la rama maestra.

  1. Vaya al repositorio de Git que desea proteger.

5 Git Hooks 05 Cd al repositorio

  1. Cree un archivo de enlace de Git con su secuencia de comandos de verificación. Dado que este es un enlace que debe ejecutarse antes de un «empuje», debe crear un archivo de enlace «pre-empuje»:
touch .git/hooks/pre-push
  1. Abra su nuevo archivo de enlace en un editor de texto.
nano .git/hooks/pre-push
  1. En el interior, escriba su nuevo gancho «pre-empuje». Por ejemplo, el siguiente es un script que le pedirá confirmación cuando esté presionando desde la rama maestra:
#!/bin/sh
 
protect='master'
current=$(git symbolic-ref HEAD | sed -e 's,.*/(.*),1,')
 
if [ $protect = $current ]
then
    read -p "Confirm push to master? Y/n." -n 1 -r < /dev/tty
    echo
    if echo $REPLY | grep -E '^[Yy]$' > /dev/null
    then
        exit 0
    fi
    exit 1
else
    exit 0
fi
  1. Guarde su nuevo gancho. En nano, haga esto presionando Ctrl + O, luego Ctrl + X.

5 anzuelos Git 07 anzuelos preempujados rellenos

  1. Ejecute el siguiente comando para asegurarse de que Git pueda ejecutar su nuevo enlace.
chmod +x .git/hooks/pre-push

2. Rechazar empujones a la rama principal

Además de evitar empujar al maestro, también puede crear un gancho del lado del servidor que rechazará cualquier empuje a su rama maestra. Esto es increíblemente útil si comparte un repositorio con varios desarrolladores.

5 Git Hooks 08 Ejemplo de registro de Git

Solucione esto creando un gancho de «recepción previa» que evitará automáticamente que cualquier usuario restringido ingrese a la rama maestra.

  1. Cree el archivo de gancho Git «pre-receive» en su repositorio remoto.
touch .git/hooks/pre-receive
  1. Abra este archivo.
nano .git/hooks/pre-receive
  1. Agregue el script de rechazo en su gancho de «pre-recepción». Por ejemplo, las siguientes líneas de código deberían funcionar de inmediato:
#!/bin/sh
 
branch=$(git symbolic-ref HEAD | sed -e 's,.*/(.*),1,')
 
blacklist=(alice bob)
 
if [[ ${blacklist[*]} =~ $USER ]]; then
    if [ "$branch" == "master" ]; then
        echo "You are not allowed commit changes in this branch"
        exit 1
    fi
fi
  1. Guarde su nuevo archivo de gancho. En mi caso, necesito presionar Ctrl + O, luego Ctrl + X para guardar el archivo.
  1. Guarde su script de gancho y hágalo ejecutable.
chmod +x .git/hooks/pre-receive

Propina: también puede usar el alias de Git para hacer que el uso de Git sea más eficiente.

3. Bloquee el repositorio para que no se vuelva a basar

Otro error común que comete un usuario en Git es cambiar la base de la rama actualmente activa. Esto puede ser un problema frustrante si está trabajando en un repositorio con varios colaboradores, ya que la reorganización eliminará las confirmaciones que hayan realizado otros usuarios.

5 Git Hooks 11 Página man de Git Rebase

Puede evitar este problema creando un gancho «pre-rebase» que verificará si la rama actual está bloqueada.

  1. Cree un archivo «pre-rebase» en su directorio «.git/hooks»:
touch .git/hooks/pre-rebase
  1. Abra este archivo para editarlo.
nano .git/hooks/pre-rebase
  1. Agregue el script de rebase dentro de su nuevo archivo de enlace.
#!/bin/sh
 
branch="$2"
[ -n "$branch" ] || branch=$(git rev-parse --abbrev-ref HEAD)
lock="branch.${branch}.rebaselock"
 
if [ "$(git config --bool "$lock")" = true ]; then
echo "pre-rebase hook: "$lock" is set to true. Refusing to rebase."
exit 1
fi
  1. Guarde su nuevo archivo de enlace y hágalo ejecutable.
chmod +x .git/hooks/pre-rebase

4. Forzar una verificación de estilo y sintaxis en su código

Uno de los usos más útiles de un gancho de Git es vincularlo con un filtro de código. Este es un programa simple que verifica si su código sigue el estilo y el formato de un proyecto.

5 Git Hooks 14 Shellcheck Man Page

  1. Para vincular un linter a su repositorio de Git, primero cree un archivo de enlace «pre-commit».
touch .git/hooks/pre-commit
  1. Instale el linter apropiado para el idioma de su proyecto. En este caso, estoy usando «shellcheck» para analizar mi código Bash:
sudo apt install shellcheck
  1. Abra su nuevo archivo de enlace y agregue el siguiente script.
#!/bin/bash
for file in $(git diff --cached --name-only --diff-filter=AM | grep -E '.sh$')
do
 
  shellcheck "$file" # Run the linter for every new file.
 
  if [ $? -ne 0 ]; then
    exit 1 # Terminate the commit if the linter fails.
  fi
done
  1. Guarde su nuevo archivo de enlace y hágalo ejecutable:
chmod +x .git/hooks/pre-commit

5. Notificar automáticamente a los usuarios con cambios en el repositorio

Por último, también puede crear un enlace de Git que enviará automáticamente un correo electrónico cada vez que su repositorio reciba una nueva confirmación. Esto es útil si desea crear un sistema de notificación simple para su repositorio.

  1. Cree un archivo de enlace «posterior a la recepción» en el directorio .git/hooks de su repositorio:
touch .git/hooks/post-receive
  1. Abra su nuevo archivo de gancho de Git e ingrese el siguiente script:
#!/bin/sh
 
commit_message=$(git log -1 --pretty=%B)
users=("alice@example.invalid" "bob@example.invalid" "mary@example.invalid")
 
for user in "${users[@]}"; do
    mail -s "New Commit: $commit_message" $user < /dev/null
    done
  1. Guarde su nuevo archivo de enlace y hágalo ejecutable.
chmod +x .git/hooks/post-receive

Preguntas frecuentes

¿Puedo escribir mis ganchos de Git en un lenguaje compilado, como C?

Una de las mayores limitaciones de los ganchos de Git es que requiere que uses un lenguaje que puedas ejecutar directamente desde la terminal. Esto significa que los ganchos de Git no admiten ningún lenguaje compilado para sus scripts. Por ejemplo, puede crear un nuevo gancho Git utilizando Python o Shell, pero no C o C++.

¿Es posible ejecutar múltiples ganchos en el mismo repositorio de Git?

Sí. Si bien los ejemplos anteriores muestran los ganchos como características únicas y discretas, puede combinarlos fácilmente para crear su propio flujo de trabajo único, lo que hace que los ganchos de Git sean increíblemente flexibles y adaptables para cualquier situación de codificación. Por ejemplo, puede usar tanto el gancho de pre-empuje «Prevenir Push to Master» como el gancho de pre-compromiso «Comprobación de sintaxis» en su propio repositorio.

¿Por qué los ganchos Git de correo electrónico no envían un correo electrónico a los usuarios?

Lo más probable es que este problema se deba a que su servidor remoto no puede enviar correctamente ningún correo electrónico saliente. Para solucionar esto, asegúrese de que su servidor remoto sea seguro y que tenga un agente de entrega de correo en funcionamiento junto con un dominio SMTP.

Credito de imagen: Unsplash. Todas las alteraciones y capturas de pantalla Ramces Red.

¿Le ha parecido útil este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 0 / 5. Recuento de votos: 0

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.