remove - git tag best practices
Ganchos de pre empujar de Git (7)
Me gustaría ejecutar pruebas unitarias antes de cada prueba de git y si las pruebas fallan, cancelar el envío, pero ni siquiera puedo encontrar el enlace previo al envío, solo hay precompromiso y prerreabilidad.
Git obtuvo el gancho pre-push en la versión 1.8.2.
Los ganchos de pre-empuje son lo que necesitaba junto con los ganchos pre-commit. Además de proteger una sucursal, también pueden proporcionar seguridad adicional combinada con ganchos de precompromiso.
Y para un ejemplo sobre cómo usar (tomado y adoptado y mejorado a partir de esta agradable entrada )
Ejemplo simple para iniciar sesión en vagabundo, ejecutar pruebas y luego empujar
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh [email protected] -i ~/.vagrant.d/insecure_private_key ''cd /vagrant/tests; /vagrant/vendor/bin/phpunit''"
protected_branch=''master''
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e ''s,.*//(.*/),/1,'')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
Como puede ver, el ejemplo usa una rama protegida, sujeta al gancho de pre-inserción.
El https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample muestra los parámetros, etc., al gancho de pre-push
( $1
es el nombre remoto, $2
URL) y cómo acceder a los commit (las líneas read
desde stdin tienen estructura <local ref> <local sha1> <remote ref> <remote sha1>
)
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_sha" = $z40 ]
then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=`git rev-list -n 1 --grep ''^WIP'' "$range"`
if [ -n "$commit" ]
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0
No hay un gancho para eso, porque un empuje no es una operación que modifica su repositorio.
Sin embargo, puede hacer los controles del lado receptor en el gancho post-receive
. Ahí es donde generalmente rechazarías un empujón entrante. Ejecutar pruebas unitarias puede ser un poco intensivo en un anzuelo, pero eso depende de usted.
Para el registro, hay un parche para Git 1.6 que agrega un gancho de pre-push . No sé si funciona en contra de 1.7.
En lugar de meterse con eso, podrías ejecutar el script push como se recomienda @kubi. También puede convertirlo en una tarea de Rake para que esté en su repositorio. ruby-git podría ayudar con esto. Si comprueba el repositorio objetivo, puede ejecutar pruebas solo cuando avance al repositorio de producción.
Finalmente, podría ejecutar sus pruebas en su gancho pre-commit
pero verifique para qué rama se está comprometiendo. Entonces podría tener, por ejemplo, una sucursal de production
que requiera que todas las pruebas pasen antes de aceptar una confirmación, pero a su master
no le importa. limerick_rake puede ser útil en ese escenario.
Prefiero ejecutar la prueba en un pre-commit-hook. Porque el cambio ya está registrado al comprometerse. Push and pull solo intercambia información sobre cambios ya registrados. Si una prueba falla, ya tendría una revisión "rota" en su repositorio. Ya sea que lo estés presionando o no.
Si está utilizando la línea de comando, la manera más fácil de hacerlo es escribir un script push que ejecute las pruebas de su unidad y, si lo logran, completa el empuje.
Editar
A partir de git 1.8.2, esta respuesta está desactualizada. Ver la respuesta de manojlds arriba.
Git obtuvo el gancho pre-push
en la versión 1.8.2
.
Ejemplo pre-push
script de pre-push
: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
1.8.2 notas de la versión que hablan sobre el nuevo gancho de pre-push: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt