Szukaj…
Składnia
- .git / hooks / applypatch-msg
- .git / hooks / commit-msg
- .git / hooks / post-update
- .git / hooks / pre-applypatch
- .git / hooks / pre-commit
- .git / hooks / Preparation-commit-msg
- .git / hooks / pre-push
- .git / hooks / pre-rebase
- .git / hooks / update
Uwagi
--no-verify
lub -n
aby pominąć wszystkie lokalne hooki na danym poleceniu git.
Np .: git commit -n
Informacje na tej stronie zostały zebrane z oficjalnych dokumentów Git i Atlassian .
Commit-msg
Ten haczyk jest podobny do haka prepare-commit-msg
, ale jest wywoływany, gdy użytkownik wprowadzi komunikat zatwierdzenia, a nie wcześniej. Jest to zwykle używane do ostrzegania programistów, jeśli ich komunikat zatwierdzenia ma niepoprawny format.
Jedynym argumentem przekazanym do tego hooka jest nazwa pliku zawierającego komunikat. Jeśli nie podoba ci się komunikat, który wprowadził użytkownik, możesz albo zmienić ten plik w miejscu (tak samo jak prepare-commit-msg
), lub możesz całkowicie przerwać zatwierdzenie, wychodząc ze stanu niezerowego.
Poniższy przykład służy do sprawdzenia, czy w komunikacie zatwierdzenia znajduje się słowo bilet, po którym następuje liczba
word="ticket [0-9]"
isPresent=$(grep -Eoh "$word" $1)
if [[ -z $isPresent ]]
then echo "Commit message KO, $word is missing"; exit 1;
else echo "Commit message OK"; exit 0;
fi
Lokalne haki
Lokalne zaczepy wpływają tylko na lokalne repozytoria, w których się znajdują. Każdy programista może zmieniać własne lokalne zaczepy, więc nie można ich używać niezawodnie jako sposobu egzekwowania zasad zatwierdzania. Zostały zaprojektowane tak, aby ułatwić programistom przestrzeganie określonych wytycznych i unikanie potencjalnych problemów w przyszłości.
Istnieje sześć rodzajów lokalnych przechwyceń: wstępne zatwierdzenie, przygotowanie-zatwierdzenie-msg, zatwierdzenie-msg, po zatwierdzeniu, po pobraniu i przedrebase.
Pierwsze cztery haczyki odnoszą się do zatwierdzeń i pozwalają ci mieć kontrolę nad każdą częścią w cyklu życia zatwierdzenia. Ostatnie dwa pozwalają wykonać dodatkowe czynności lub kontrole bezpieczeństwa dla poleceń git checkout i git rebase.
Wszystkie zaczepy „przed” umożliwiają zmianę działania, które ma się odbyć, a zaczepy „po” służą przede wszystkim do powiadomień.
Kasa po zakończeniu transakcji
Ten hak działa podobnie do haka post-commit
, ale jest wywoływany za każdym razem, gdy pomyślnie sprawdzasz referencję za pomocą git checkout
. Może to być przydatne narzędzie do czyszczenia katalogu roboczego z automatycznie generowanych plików, które w przeciwnym razie spowodowałyby zamieszanie.
Ten hak akceptuje trzy parametry:
- ref. poprzedniej HEAD,
- ref nowego HEAD, oraz
- flaga wskazująca, czy była to gałąź lub gałąź pliku (odpowiednio
1
lub0
).
Status wyjścia nie ma wpływu na polecenie git checkout
.
Po zatwierdzeniu
Ten hak jest wywoływany natychmiast po haku commit-msg
. Nie może zmienić wyniku operacji git commit
, dlatego jest używany głównie do celów powiadomień.
Skrypt nie przyjmuje parametrów, a jego status wyjścia w żaden sposób nie wpływa na zatwierdzenie.
Po otrzymaniu
Ten hak jest wywoływany po udanej operacji pchania. Jest zwykle używany do celów powiadomień.
Skrypt nie przyjmuje parametrów, ale jest wysyłany te same informacje, co pre-receive
za pośrednictwem standardowego wejścia:
<old-value> <new-value> <ref-name>
Wstępnie zatwierdzić
Ten zaczep jest wykonywany za każdym razem, gdy uruchamiasz git commit
, aby sprawdzić, co ma zostać git commit
. Możesz użyć tego haka, aby sprawdzić migawkę, która ma zostać zatwierdzona.
Ten rodzaj przechwytywania jest przydatny do uruchamiania automatycznych testów, aby upewnić się, że przychodzące zatwierdzenie nie psuje istniejącej funkcjonalności twojego projektu. Ten typ haka może również sprawdzać, czy występują spacje lub błędy EOL.
Do skryptu poprzedzającego zatwierdzenie nie są przekazywane żadne argumenty, a wychodzenie ze statusem niezerowym przerywa całe zatwierdzenie.
Przygotuj-zatwierdzenie-msg
Ten hak jest wywoływany po haku pre-commit
aby wypełnić edytor tekstowy komunikatem zatwierdzenia. Jest to zwykle używane do zmiany automatycznie generowanych komunikatów zatwierdzania dla zgniecionych lub scalonych zatwierdzeń.
Do tego haka przekazywane są od jednego do trzech argumentów:
- Nazwa pliku tymczasowego zawierającego wiadomość.
- Rodzaj zatwierdzenia też
- wiadomość (opcja
-m
lub-F
), - szablon (opcja
-t
), - scalanie (jeśli jest to zatwierdzanie scalania) lub
- squash (jeśli zgniata inne zatwierdzenia).
- wiadomość (opcja
- Skrót SHA1 odpowiedniego zatwierdzenia. Jest to podawane tylko wtedy, gdy
--amend
opcję-c
,-C
lub--amend
.
Podobne do pre-commit
, wyjście ze statusem niezerowym przerywa zatwierdzenie.
Pre-rebase
Ten hak jest wywoływany, zanim git rebase
zacznie zmieniać strukturę kodu. Ten zaczep jest zwykle używany do upewnienia się, że operacja zmiany bazy jest odpowiednia.
Ten hak przyjmuje 2 parametry:
- odgałęzienie, z którego rozwidlono serię, oraz
- gałąź jest ponownie bazowana (pusta przy ponownej publikacji obecnej gałęzi).
Możesz przerwać operację bazowania, wychodząc ze stanu niezerowego.
Odbierz wcześniej
Ten zaczep jest wykonywany za każdym razem, gdy ktoś używa polecenia git push
do wypychania zatwierdzeń do repozytorium. Zawsze znajduje się w zdalnym repozytorium, które jest celem wypychania, a nie w źródłowym (lokalnym) repozytorium.
Hak działa przed aktualizacją jakichkolwiek odniesień. Zwykle służy do egzekwowania dowolnego rodzaju polityki rozwoju.
Skrypt nie przyjmuje parametrów, ale każde wysyłane odwołanie jest przekazywane do skryptu w osobnym wierszu na standardowym wejściu w następującym formacie:
<old-value> <new-value> <ref-name>
Aktualizacja
Ten hak jest wywoływany po pre-receive
i działa w ten sam sposób. Jest wywoływany, zanim cokolwiek zostanie zaktualizowane, ale jest wywoływany osobno dla każdego odsuniętego odwołania, a nie dla wszystkich poleceń naraz.
Ten hak przyjmuje następujące 3 argumenty:
- nazwa aktualizowanej referencji,
- stara nazwa obiektu zapisana w referencji, oraz
- nowa nazwa obiektu zapisana w ref.
Są to te same informacje, które są przekazywane do pre-receive
, ale ponieważ update
jest wywoływana osobno dla każdego odwołania, możesz odrzucić niektóre odwołania, jednocześnie pozwalając innym.
Pre-push
Dostępne w Git 1.8.2 i nowszych.
Można jednak użyć haków przed popchnięciem, aby zapobiec pchnięciu. Przyczyny, dla których jest to pomocne, obejmują: blokowanie przypadkowych ręcznych wypychań do określonych gałęzi lub blokowanie wypychań, jeśli ustanowione sprawdzenie nie powiedzie się (testy jednostkowe, składnia).
Hak przed wypychaniem jest tworzony po prostu przez utworzenie pliku o nazwie pre-push
pod .git/hooks/
i ( gotcha alert ), upewniając się, że plik jest wykonywalny: chmod +x ./git/hooks/pre-push
.
Oto przykład Hannah Wolfe, który blokuje dążenie do opanowania:
#!/bin/bash
protected_branch='master'
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $current_branch ]
then
read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
echo
if echo $REPLY | grep -E '^[Yy]$' > /dev/null
then
exit 0 # push will execute
fi
exit 1 # push will not execute
else
exit 0 # push will execute
fi
Oto przykład Volkan Unsal, który upewnia się, że testy RSpec przeszły przed zezwoleniem na push:
#!/usr/bin/env ruby
require 'pty'
html_path = "rspec_results.html"
begin
PTY.spawn( "rspec spec --format h > rspec_results.html" ) do |stdin, stdout, pid|
begin
stdin.each { |line| print line }
rescue Errno::EIO
end
end
rescue PTY::ChildExited
puts "Child process exit!"
end
# find out if there were any errors
html = open(html_path).read
examples = html.match(/(\d+) examples/)[0].to_i rescue 0
errors = html.match(/(\d+) errors/)[0].to_i rescue 0
if errors == 0 then
errors = html.match(/(\d+) failure/)[0].to_i rescue 0
end
pending = html.match(/(\d+) pending/)[0].to_i rescue 0
if errors.zero?
puts "0 failed! #{examples} run, #{pending} pending"
# HTML Output when tests ran successfully:
# puts "View spec results at #{File.expand_path(html_path)}"
sleep 1
exit 0
else
puts "\aCOMMIT FAILED!!"
puts "View your rspec results at #{File.expand_path(html_path)}"
puts
puts "#{errors} failed! #{examples} run, #{pending} pending"
# Open HTML Ooutput when tests failed
# `open #{html_path}`
exit 1
end
Jak widać, istnieje wiele możliwości, ale kluczowym elementem jest exit 0
jeśli wydarzyły się dobre rzeczy, i exit 1
jeśli wydarzyły się złe rzeczy. Za każdym razem, gdy wyjdziesz exit 1
push zostanie zablokowany, a twój kod będzie w stanie, w jakim był przed uruchomieniem git push...
Korzystając z haków po stronie klienta, należy pamiętać, że użytkownicy mogą pominąć wszystkie haki po stronie klienta, używając opcji „- nie-zweryfikuj” po wypchnięciu. Jeśli polegasz na haku, aby wymusić proces, możesz zostać poparzony.
Dokumentacja: https://git-scm.com/docs/githooks#_pre_push
Oficjalna próbka: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
Sprawdź kompilację Maven (lub inny system kompilacji) przed zatwierdzeniem
.git/hooks/pre-commit
#!/bin/sh
if [ -s pom.xml ]; then
echo "Running mvn verify"
mvn clean verify
if [ $? -ne 0 ]; then
echo "Maven build failed"
exit 1
fi
fi
Automatyczne przekazywanie niektórych wypychań do innych repozytoriów
haczyki post-receive
mogą służyć do automatycznego przekazywania przychodzących wypychań do innego repozytorium.
$ cat .git/hooks/post-receive
#!/bin/bash
IFS=' '
while read local_ref local_sha remote_ref remote_sha
do
echo "$remote_ref" | egrep '^refs\/heads\/[A-Z]+-[0-9]+$' >/dev/null && {
ref=`echo $remote_ref | sed -e 's/^refs\/heads\///'`
echo Forwarding feature branch to other repository: $ref
git push -q --force other_repos $ref
}
done
W tym przykładzie egrep
regularne egrep
szuka określonego formatu gałęzi (tutaj: JIRA-12345 jako nazwa problemów Jira). Oczywiście możesz pominąć tę część, jeśli chcesz przekazać wszystkie gałęzie.