Frena un cambio roto antes de compartirlo
Un kiosco apunta sus precios en un archivo. Alguien borra el precio del té por error y hace push. Ahora todo el equipo tiene una lista rota.
Una comprobación que se ejecute al hacer push habría dicho que no. Los equipos reales usan comprobaciones así todo el día.
Al terminar esta lección
Nota
Puedo hacer que Git ejecute una comprobación antes de que un push siga adelante.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Gancho | un script que Git ejecuta en un momento fijo |
| Comprobación | una prueba que pasa o falla |
| Código de salida | el número con que acaba un programa, 0 si fue bien |
| CI | un servidor que ejecuta comprobaciones en cada push |
| Ejecutor | la máquina que realiza el trabajo de una CI |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un gancho es un script que Git ejecuta
Git busca en la carpeta .git/hooks scripts con nombres fijos. Un script llamado pre-push se ejecuta justo antes de un push. Si termina con un código de salida distinto de cero, Git detiene el push.
El script debe ser ejecutable. Aquí la comprobación busca el precio del té en precios.txt.
Crea una carpeta compartida donde subir
git init --bare -b main compartido.gitSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Clónala como puesto
git clone compartido.git puestoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea un archivo con dos precios
printf 'Cafe 1.50\nTe 1.20\n' > puesto/precios.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la comprobación
printf '#!/bin/sh\ngrep -q "Te" precios.txt || { echo "comprobacion fallida: falta el precio del Te"; exit 1; }\necho "comprobacion superada"\n' > puesto/.git/hooks/pre-pushSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Hazla ejecutable
chmod +x puesto/.git/hooks/pre-pushSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Prepara el archivo
git -C puesto add precios.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Guárdalo en un commit
git -C puesto commit -m "Anadir precios"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Haz push y mira la comprobación
git -C puesto push -u origin mainSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una comprobación fallida rechaza el push
Ahora rompe el archivo a propósito. Borra la línea del té y guarda el commit. La comprobación falla y Git rechaza el push, así que el commit roto se queda en tu ordenador.
Después cancelas el commit malo con git revert, que viste antes, y haces push otra vez.
Borra la línea del té
sed -i '/Te/d' puesto/precios.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Guarda el error
git -C puesto commit -am "Quitar el te por error"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Intenta subirlo
git -C puesto pushSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cancela el error
git -C puesto revert --no-edit HEADSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Haz push otra vez
git -C puesto pushSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que un gancho es parte del proyecto y que todo el equipo lo tiene. No es así. Un gancho vive en .git, y un clon no lo copia. Cualquiera puede saltárselo con --no-verify. Un equipo necesita la misma comprobación en el servidor.
La CI ejecuta la misma comprobación
CI significa integración continua: un servidor que ejecuta comprobaciones cada vez que alguien hace push. Escribes los pasos en un archivo guardado en el repositorio, así que cada clon tiene las mismas reglas.
En Gitea el archivo vive en .gitea/workflows. El servidor entrega cada trabajo a un ejecutor. El resultado se ve en la pull request, y quien revisa ve un fallo enseguida.
Ejemplo resuelto: un archivo de flujo
| Línea del archivo | Qué dice |
|---|---|
| `name: check` | el nombre que muestra la página |
| `on: [push]` | ejecutarse en cada push |
| `runs-on: ubuntu-latest` | el tipo de máquina que se usa |
| `- uses: actions/checkout@v4` | traer primero los archivos del proyecto |
| `- run: grep -q Te precios.txt` | la comprobación en sí, la misma prueba que el gancho |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El Gitea del laboratorio no tiene ejecutor
Este archivo hace el trabajo del gancho. Cada paso se ejecuta en orden, y un paso que termina con un estado distinto de cero hace fallar el trabajo.
El Gitea del laboratorio acepta el archivo y anota una ejecución por cada push, pero se queda en espera. No hay ningún ejecutor conectado, así que nada la realiza. Un equipo real conecta uno.