Git
Haki po stronie klienta Git
Szukaj…
Wprowadzenie
Podobnie jak wiele innych systemów kontroli wersji, Git ma sposób na uruchomienie niestandardowych skryptów, gdy wystąpią pewne ważne działania. Istnieją dwie grupy tych haków: po stronie klienta i po stronie serwera. Haki po stronie klienta są uruchamiane przez operacje takie jak zatwierdzanie i scalanie, podczas gdy haki po stronie serwera działają w operacjach sieciowych, takich jak odbieranie wypychanych poleceń. Możesz użyć tych haków z różnych powodów.
Instalowanie haka
Wszystkie hooki są przechowywane w podkatalogu hooks
katalogu Git. W większości projektów jest to .git/hooks
.
Aby włączyć skrypt hooks
, umieść plik w podkatalogu hooks
katalogu .git
który ma odpowiednią nazwę (bez rozszerzenia) i jest wykonywalny.
Git haczyk wstępny
skrypt pre-push jest wywoływany przez git push
po sprawdzeniu statusu zdalnego, ale zanim cokolwiek zostanie wypchnięte. Jeśli skrypt zakończy działanie ze statusem niezerowym, nic nie zostanie wypchnięte.
Ten hak jest wywoływany z następującymi parametrami:
$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)
Informacje o wypychanych zatwierdzeniach są dostarczane jako wiersze do standardowego wejścia w postaci:
<local_ref> <local_sha1> <remote_ref> <remote_sha1>
Przykładowe wartości:
local_ref = refs/heads/master
local_sha1 = 68a07ee4f6af8271dc40caae6cc23f283122ed11
remote_ref = refs/heads/master
remote_sha1 = efd4d512f34b11e3cf5c12433bbedd4b1532716f
Poniżej przykładowy skrypt pre-push został pobrany z domyślnego pre-push.sample, który został automatycznie utworzony po zainicjowaniu nowego repozytorium za pomocą 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