Generator git hooków

Zbuduj instalator hooków Git: lint przed commitem, kontrola wiadomości commita i testy przed wysłaniem zmian.

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}

Domyślnie Conventional Commits, np. feat(api): dodaj logowanie. Sprawdzana jest pierwsza linia wiadomości.

Instalator gotowy

3 hooki OK

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

Czysty Git

Katalog hooków

.git/hooks

Linie skryptu

53

Rozmiar

2,0 KB

install-hooks.sh

#!/usr/bin/env sh set -eu # Instalator hooków Git — uruchom w katalogu repozytorium. target_dir="$(git rev-parse --git-path hooks)" mkdir -p "$target_dir" # Instalacja hooka pre-commit if [ -f "$target_dir/pre-commit" ] && [ ! -f "$target_dir/pre-commit.bak" ]; then cp "$target_dir/pre-commit" "$target_dir/pre-commit.bak" fi { printf '%s\n' '#!/usr/bin/env sh' printf '%s\n' 'set -eu' printf '%s\n' 'npm run lint' } > "$target_dir/pre-commit" chmod +x "$target_dir/pre-commit" # Instalacja hooka commit-msg if [ -f "$target_dir/commit-msg" ] && [ ! -f "$target_dir/commit-msg.bak" ]; then cp "$target_dir/commit-msg" "$target_dir/commit-msg.bak" fi { printf '%s\n' '#!/usr/bin/env sh' printf '%s\n' 'set -eu' printf '%s\n' 'if [ "$#" -lt 1 ]; then' printf '%s\n' ' echo '"'"'Git nie przekazał pliku z wiadomością commita.'"'"' >&2' printf '%s\n' ' exit 2' printf '%s\n' 'fi' printf '%s\n' 'subject="$(grep -v -e '"'"'^#'"'"' -e '"'"'^[[:space:]]*$'"'"' "$1" | head -n 1)"' printf '%s\n' 'case "$subject" in' printf '%s\n' ' '"'"'Merge '"'"'*|'"'"'Revert '"'"'*|'"'"'fixup! '"'"'*|'"'"'squash! '"'"'*) exit 0 ;;' printf '%s\n' 'esac' printf '%s\n' 'if ! printf '"'"'%s\n'"'"' "$subject" | grep -Eq -- '"'"'^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+'"'"'; then' printf '%s\n' ' echo '"'"'Nieprawidłowa wiadomość commita. Użyj Conventional Commits.'"'"' >&2' printf '%s\n' ' echo '"'"'Wymagany wzorzec: ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+'"'"' >&2' printf '%s\n' ' exit 1' printf '%s\n' 'fi' } > "$target_dir/commit-msg" chmod +x "$target_dir/commit-msg" # Instalacja hooka pre-push if [ -f "$target_dir/pre-push" ] && [ ! -f "$target_dir/pre-push.bak" ]; then cp "$target_dir/pre-push" "$target_dir/pre-push.bak" fi { printf '%s\n' '#!/usr/bin/env sh' printf '%s\n' 'set -eu' printf '%s\n' 'npm test' } > "$target_dir/pre-push" chmod +x "$target_dir/pre-push" printf '%s\n' 'Hooki Git zostały zainstalowane i otrzymały prawo wykonywania.'
2 077 znaków · 247 słów · 54 linii
  1. Zapisz skrypt jako install-hooks.sh w katalogu głównym repozytorium.
  2. Uruchom: sh install-hooks.sh. Hooki trafią do .git/hooks z prawem wykonywania.
  3. 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

#!/usr/bin/env sh set -eu npm run lint

.git/hooks/commit-msg

#!/usr/bin/env sh set -eu if [ "$#" -lt 1 ]; then echo 'Git nie przekazał pliku z wiadomością commita.' >&2 exit 2 fi subject="$(grep -v -e '^#' -e '^[[:space:]]*$' "$1" | head -n 1)" case "$subject" in 'Merge '*|'Revert '*|'fixup! '*|'squash! '*) exit 0 ;; esac if ! printf '%s\n' "$subject" | grep -Eq -- '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+'; then echo 'Nieprawidłowa wiadomość commita. Użyj Conventional Commits.' >&2 echo 'Wymagany wzorzec: ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+' >&2 exit 1 fi

.git/hooks/pre-push

#!/usr/bin/env sh set -eu npm test

Ściąga: najważniejsze hooki Git po stronie klienta

Hooki uruchamiane lokalnie (dokumentacja githooks)
HookKiedy działaArgumentyMoż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.

HookMoment uruchomieniaZadanie generatora
pre-commitPrzed utworzeniem commitaUruchamia wskazany lint, np. ESLint, Ruff, PHP_CodeSniffer lub cargo clippy; opcjonalnie najpierw blokuje commit na main/master
commit-msgPo zapisaniu wiadomościSprawdza temat wiadomości (pierwszą linię bez komentarzy) wyrażeniem zgodnym z grep -E
pre-pushPrzed wysłaniem referencjiUruchamia testy i blokuje push, gdy polecenie zwróci błąd
InstalatorJednorazowo w repozytoriumTworzy katalog hooków (tryb Git), robi kopię .bak istniejących plików, zapisuje hooki i ustawia bit wykonywalny

Jak użyć wygenerowanego instalatora

  1. 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ć.
  2. 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.
  3. Kliknij „Generuj instalator”, a potem skopiuj wynik albo pobierz install-hooks.sh do katalogu głównego klonu.
  4. Uruchom sh install-hooks.sh. Instalator zapisze hooki i wykona chmod +x; nie trzeba ręcznie poprawiać uprawnień każdego pliku.
  5. 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 commitaDomyślny wzorzecPowód
feat(api): dodaj logowanieprzechodzityp, zakres, dwukropek ze spacją, opis
refactor(db): uprość zapytaniaprzechodzityp z listy, zakres w nawiasie
Feat: dodaj logowanieodrzuconygrep -E rozróżnia wielkość liter
fix:literówkaodrzuconybrak spacji po dwukropku
poprawkiodrzuconybrak typu
Merge branch 'dev'przechodzi przy włączonej opcjicommit 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.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!