Git
Crochets côté client Git
Recherche…
Introduction
Comme beaucoup d'autres systèmes de contrôle de version, Git permet de lancer des scripts personnalisés lorsque certaines actions importantes se produisent. Il existe deux groupes de ces points d'ancrage: côté client et côté serveur. Les hooks côté client sont déclenchés par des opérations telles que la validation et la fusion, tandis que les hooks côté serveur s'exécutent sur des opérations réseau telles que la réception de commits poussés. Vous pouvez utiliser ces crochets pour toutes sortes de raisons.
Installation d'un crochet
Les hooks sont tous stockés dans le sous-répertoire hooks
répertoire Git. Dans la plupart des projets, il s'agit de .git/hooks
.
Pour activer un script de hook, placez un fichier dans le sous-répertoire hooks
de votre répertoire .git
nommé de manière appropriée (sans aucune extension) et exécutable.
Git pre-push hook
Le script pre-push est appelé par git push
après avoir vérifié l'état de la télécommande, mais avant que rien n'ait été poussé. Si ce script se termine avec un statut non nul, rien ne sera poussé.
Ce hook est appelé avec les paramètres suivants:
$1 -- Name of the remote to which the push is being done (Ex: origin)
$2 -- URL to which the push is being done (Ex: https://<host>:<port>/<username>/<project_name>.git)
Les informations sur les commits en cours sont fournies sous forme de lignes à l'entrée standard sous la forme:
<local_ref> <local_sha1> <remote_ref> <remote_sha1>
Valeurs d'échantillon:
local_ref = refs/heads/master
local_sha1 = 68a07ee4f6af8271dc40caae6cc23f283122ed11
remote_ref = refs/heads/master
remote_sha1 = efd4d512f34b11e3cf5c12433bbedd4b1532716f
Dans l'exemple ci-dessous, un script pré-push a été extrait de pre-push.sample par défaut qui a été automatiquement créé lors de l'initialisation d'un nouveau référentiel avec git init
# 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