Generator git hooków
Zbuduj instalator hooków Git: lint przed commitem, kontrola wiadomości commita i testy przed wysłaniem zmian.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Domyślnie Conventional Commits, np. feat(api): dodaj logowanie. Sprawdzana jest pierwsza linia wiadomości.
Instalator gotowy
Instalator dla czystego Gita: pre-commit, commit-msg, pre-push. Zapisz jako install-hooks.sh i uruchom w katalogu repozytorium: sh install-hooks.sh
Narzędzie
Katalog hooków
Linie skryptu
Rozmiar
install-hooks.sh
- Zapisz skrypt jako
install-hooks.shw katalogu głównym repozytorium. - Uruchom:
sh install-hooks.sh. Hooki trafią do.git/hooksz prawem wykonywania. - Sprawdź: zrób próbny commit. Jednorazowe pominięcie:
git commit --no-verify.
Treść pojedynczych hooków (do wklejenia ręcznie)
.git/hooks/pre-commit
.git/hooks/commit-msg
.git/hooks/pre-push
Ściąga: najważniejsze hooki Git po stronie klienta
| Hook | Kiedy działa | Argumenty | Może zablokować? |
|---|---|---|---|
| pre-commit | przed utworzeniem commita, zanim powstanie wiadomość | brak | tak; pomija go --no-verify |
| prepare-commit-msg | po przygotowaniu domyślnej wiadomości, przed edytorem | plik wiadomości, źródło, SHA | tak; --no-verify go nie pomija |
| commit-msg | po wpisaniu wiadomości | plik z wiadomością | tak; pomija go --no-verify |
| post-commit | po utworzeniu commita | brak | nie (tylko powiadomienie) |
| pre-rebase | przed git rebase | gałąź bazowa, gałąź (opcjonalnie) | tak |
| post-checkout | po git checkout / git switch | poprzedni HEAD, nowy HEAD, flaga gałęzi | nie |
| post-merge | po udanym git merge (także w git pull) | flaga squash | nie |
| pre-push | przed wysłaniem zmian na serwer | nazwa i adres zdalnego repo; refy na stdin | tak; pomija go --no-verify |
Czysty Git czy Husky?
Katalog .git/hooks nie trafia do repozytorium, więc każdy członek zespołu musi uruchomić instalator u siebie. Husky trzyma hooki w .husky, który się commituje, a po npm install działają u wszystkich. Bez Node wybierz czysty Git albo ustaw git config core.hooksPath na katalog w repozytorium.
Jak hook blokuje operację
Hook to zwykły skrypt wykonywalny. Kod wyjścia różny od zera przerywa commit lub push. Dlatego instalator ustawia set -eu: gdy lint albo testy się nie powiodą, commit nie powstanie. Jednorazowo można to obejść flagą --no-verify, więc hooki nie zastępują sprawdzeń w CI.
Wzorzec Conventional Commits
Temat ma postać typ(zakres): opis, np. fix(koszyk): popraw sumę. Znak ! przed dwukropkiem oznacza zmianę łamiącą zgodność. Wzorzec jest wyrażeniem ERE dla grep -E: bez \d (użyj [0-9]) i bez lookahead.
Szybkie hooki to używane hooki
pre-commit działa przy każdym commicie, więc powinien trwać sekundy: lint lub formatowanie. Dłuższe testy lepiej dać do pre-push. Gdy lint całego projektu jest wolny, sprawdzaj tylko zmienione pliki, np. narzędziem lint-staged.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator git hooków: automatyczna kontrola przed commitem i push
Generator git hooków tworzy przenośny instalator POSIX shell, który zapisuje wybrane git hooks pre-commit, commit-msg i pre-push we właściwym katalogu oraz nadaje im prawo wykonywania. Wybierasz natywne hooki Git albo katalog Husky, podajesz polecenia linta i testów, a wynik uruchamiasz raz w katalogu repozytorium.
Co dokładnie powstaje
Wynikiem jest kompletny skrypt instalacyjny install-hooks.sh, zaczynający się od shebangu wskazującego /usr/bin/env sh i polecenia set -eu. Możesz go skopiować albo pobrać jako plik. Pod instalatorem jest też treść każdego hooka osobno, gdy wolisz wkleić ją ręcznie. W zwykłym trybie katalog hooków jest pobierany poleceniem git rev-parse --git-path hooks, więc działa także wtedy, gdy Git używa niestandardowej ścieżki. Dla Husky celem jest .husky/. Każdy zapisany hook dostaje własny shebang, tryb bezpiecznego przerywania oraz chmod +x.
| Hook | Moment uruchomienia | Zadanie generatora |
|---|---|---|
pre-commit | Przed utworzeniem commita | Uruchamia wskazany lint, np. ESLint, Ruff, PHP_CodeSniffer lub cargo clippy; opcjonalnie najpierw blokuje commit na main/master |
commit-msg | Po zapisaniu wiadomości | Sprawdza temat wiadomości (pierwszą linię bez komentarzy) wyrażeniem zgodnym z grep -E |
pre-push | Przed wysłaniem referencji | Uruchamia testy i blokuje push, gdy polecenie zwróci błąd |
| Instalator | Jednorazowo w repozytorium | Tworzy katalog hooków (tryb Git), robi kopię .bak istniejących plików, zapisuje hooki i ustawia bit wykonywalny |
Jak użyć wygenerowanego instalatora
- Wybierz preset: Node.js (
npm run lint,npm test), PHP (vendor/bin/phpcs,vendor/bin/phpunit), Python (ruff check .,pytest), Go (go vet ./...,go test ./...), Rust (cargo clippy -- -D warnings,cargo test) lub Husky. Preset ustawia polecenia startowe, które możesz dowolnie zmienić. - Zaznacz tylko te etapy, które mają obowiązywać. Puste polecenie, wartość wielowierszowa albo dłuższa niż 300 znaków jest odrzucana, aby przypadkowy enter nie zmienił struktury skryptu.
- Kliknij „Generuj instalator”, a potem skopiuj wynik albo pobierz
install-hooks.shdo katalogu głównego klonu. - Uruchom
sh install-hooks.sh. Instalator zapisze hooki i wykonachmod +x; nie trzeba ręcznie poprawiać uprawnień każdego pliku. - Wykonaj próbny commit i push. Sam instalator można potem usunąć albo przechowywać w repozytorium jako dokumentację polityki.
Gdy w katalogu hooków są już pliki o tej samej nazwie, opcja kopii zapasowej zapisze je jako pre-commit.bak itd. Kopia powstaje tylko raz, więc ponowne uruchomienie instalatora nie nadpisze oryginału. Kontrole uruchamiane lokalnie powinny mieć odpowiednik w generatorze GitHub Actions albo generatorze GitLab CI, ponieważ lokalny hook można pominąć.
Hook commit-msg i Conventional Commits
Hook commit-msg sprawdza, czy Git przekazał nazwę pliku wiadomości, odrzuca linie komentarzy (#) i puste, a pierwszą pozostałą linię, czyli temat, porównuje przez grep -Eq --. Separator -- chroni wzorzec zaczynający się od myślnika przed potraktowaniem jak opcja. Domyślna reguła akceptuje typy feat, fix, docs, style, refactor, perf, test, build, ci, chore i revert, opcjonalny zakres w nawiasie, opcjonalny znak wykrzyknika przed dwukropkiem (zmiana łamiąca zgodność), dwukropek, spację i opis.
| Temat commita | Domyślny wzorzec | Powód |
|---|---|---|
feat(api): dodaj logowanie | przechodzi | typ, zakres, dwukropek ze spacją, opis |
refactor(db): uprość zapytania | przechodzi | typ z listy, zakres w nawiasie |
Feat: dodaj logowanie | odrzucony | grep -E rozróżnia wielkość liter |
fix:literówka | odrzucony | brak spacji po dwukropku |
poprawki | odrzucony | brak typu |
Merge branch 'dev' | przechodzi przy włączonej opcji | commit techniczny |
Opcja „Przepuszczaj commity techniczne” pomija sprawdzanie tematów zaczynających się od Merge i Revert oraz fixup i squash z wykrzyknikiem, które Git tworzy sam przy scalaniu, cofaniu i git commit --fixup. Bez niej każdy merge commit z domyślnym tematem zostałby zablokowany.
Shell, cudzysłowy i bezpieczny zapis
Instalator korzysta wyłącznie ze składni POSIX sh, a każdą linię hooka zapisuje przez printf z bezpiecznym cytowaniem. Dzięki temu apostrof w wyrażeniu regularnym nie kończy przedwcześnie literału instalatora. Polecenia linta i testów są zachowywane jako pojedyncze linie: zostaną wykonane dopiero przez właściwy hook, a nie w chwili generowania pliku w przeglądarce. Wzorzec jest wyrażeniem ERE, więc nie obsługuje \d (zamiast tego [0-9]) ani lookahead.
Natywne hooki a Husky
Natywne pliki w .git/hooks dotyczą konkretnego klonu i nie są normalnie wersjonowane. Są lekkie i nie wymagają Node, ale każda osoba musi uruchomić instalator. Husky trzyma skrypty w .husky, więc można je commitować i instalować podczas instalacji zależności. Generator nie dodaje przestarzałego ładowania pliku _/husky.sh; generowane hooki są samodzielnymi skryptami.
Husky musi być wcześniej zainstalowany i aktywowany w projekcie. Jeśli katalogu .husky nie ma, instalator przerywa pracę i podpowiada npm install --save-dev husky && npx husky init. Generator nie edytuje package.json i nie uruchamia menedżera pakietów. Pliki pomocnicze repozytorium uporządkujesz z generatorem .gitignore, aby lokalne wyniki linta i testów nie trafiły przypadkiem do historii, a kontekst obrazów kontenerów z generatorem .dockerignore.
Ograniczenia i polityka zespołu
Hook jest barierą szybkiej informacji, a nie zabezpieczeniem serwera. Git pozwala użyć --no-verify, dlatego wymagane testy muszą działać ponownie w CI. Polecenia podajesz samodzielnie i powinny pochodzić z zaufanej konfiguracji projektu. Generator nie uruchamia ich, nie sprawdza dostępności binarek i nie instaluje zależności.
Opcja blokady gałęzi głównej dodaje do pre-commit sprawdzenie git symbolic-ref --short -q HEAD: na main lub master commit zostanie przerwany z podpowiedzią git switch -c nazwa. To zabezpiecza przed pomyłką lokalną; ochronę gałęzi na serwerze ustawia się osobno w GitHubie lub GitLabie.
Hooki powinny być szybkie: lint zmienionych plików (np. przez lint-staged) zwykle nadaje się do pre-commit, pełny zestaw testów do pre-push, a kosztowne skany do CI. Gdy test trwa kilka minut, ludzie częściej go omijają. Komunikat błędu powinien mówić, jak uruchomić poprawkę lokalnie i co dokładnie zablokowało operację.
Najczęściej zadawane pytania
Dlaczego hook nie uruchamia się po skopiowaniu pliku?
System uniksowy wymaga bitu wykonywalnego. Wygenerowany instalator sam wykonuje chmod +x. Jeśli plik został przeniesiony inną metodą, sprawdź ls -l i ponownie ustaw uprawnienie.
Jak jednorazowo pominąć git hooks?
Użyj git commit --no-verify (lub krótko -n) albo git push --no-verify. Pomija to pre-commit, commit-msg i pre-push, dlatego te same kontrole powinny działać w CI.
Czy hooki działają w Windows?
Tak w Git Bash, WSL lub innym środowisku z POSIX sh. Skrypty muszą mieć końce linii LF. W natywnym PowerShell potrzebny byłby osobny wrapper, którego ten generator nie tworzy.
Czy mogę użyć polecenia z argumentami?
Tak. Pole takie jak npm test -- --runInBand pozostaje jedną linią (do 300 znaków) i zostanie wykonane przez hook. Wielowierszowe fragmenty są celowo odrzucane; rozbudowaną logikę lepiej umieścić w wersjonowanym skrypcie projektu.
Jak zmienić format wiadomości commita?
Podaj własne wyrażenie ERE, np. ^[A-Z]+-[0-9]+: .+ dla tematów z numerem zadania w stylu ABC-123: opis. Generator bezpiecznie cytuje apostrofy, ale nie zmienia znaczenia operatorów, więc przetestuj wzorzec na kilku wiadomościach w terminalu.
Czy hook zastępuje pipeline CI?
Nie. Hook daje szybki wynik przed commitem lub push, lecz można go pominąć i działa tylko w skonfigurowanym klonie. Pipeline na serwerze jest ostatecznym, powtarzalnym warunkiem scalenia zmian.