Git-Hooks (Husky)
Dieses Repository nutzt Husky, um Git-Hooks aus dem Root-Verzeichnis .husky/ auszuführen. Die Hooks laufen automatisch an festen Punkten im Git-Workflow und halten Code-Stil und Commit-Messages im Monorepo konsistent.
Die Skripte liegen in .husky/ (pre-commit, commit-msg).
Einrichtung
Die Hooks werden im Repository-Root eingerichtet:
npm installDas prepare-Skript läuft automatisch und zeigt Git auf .husky/.
NOTE
Husky liegt im Root-package.json, weil die Hooks für den gesamten Monorepo gelten. Vue-Lint nutzt weiter zmscitizenview; Docs-Formatierung nutzt docs/.
Nach dem Klonen einmal npm install im Repo-Root ausführen (steht auch im Root-README). Für Doc-Änderungen einmal Docs-Abhängigkeiten installieren: cd docs && npm install.
Hooks
pre-commit
Leerer Platzhalter. Git führt immer zuerst pre-commit, dann commit-msg aus; die Prüfungen liegen in commit-msg, damit die Commit-Message vor Vue/Docs/PHP läuft.
commit-msg
Alle Prüfungen laufen in diesem Hook, in Fail-Fast-Reihenfolge:
- Commit-Message — Subject aus der Message-Datei, die Git übergibt
- Vue-Code-Stil — Prettier-Check in
zmscitizenview(npm run lint) - Docs-Formatierung — Prettier-Check in
docs/(npm run format:check) - PHP-Code-Stil — PHP CodeSniffer (PSR-12) über alle PHP-Module im Container
zms-web
Container-Erkennung
Die PHP-Prüfung erkennt die Laufzeit automatisch:
- Podman — wenn ein Container
zms-webläuft - Docker — Fallback, wenn Podman nicht verfügbar ist
- Überspringen — wenn kein Container läuft (nur Warnung, nicht blockierend)
Verhalten
- Commit-Message-, Vue- und Docs-Prüfungen blockieren den Commit bei Fehlern
- PHP-Prüfungen nur bei laufendem
zms-web; sonst Warnung und Überspringen
Siehe auch Code-Formatierung für manuelle PHPCS-/Prettier-Befehle.
Commit-Message-Format (Schritt 1):
type(PROJECT-123): commit message
type(PROJECT): commit messageDie Ticketnummer ist optional — PROJECT-123 oder nur PROJECT (Großbuchstaben).
Merge-Commits
Gits Standard-Merge-Subjects (z. B. Merge branch 'main' into feature-branch) werden automatisch akzeptiert, damit git merge ohne Umbenennung der Message abschließen kann. Optional geht auch eine konventionelle Message, z. B. chore(ZMS): merge main into feature-branch.
Vollständige Regeln, Typen, Projekte und Beispiele: Commit-Message-Konvention.
Fehlerbehebung
Vue-Lint schlägt fehl
cd zmscitizenview
npm run formatDanach erneut committen.
Docs-Formatierung schlägt fehl
Wenn Prettier unter docs/ Fehler meldet:
cd docs
npm run formatBei Bedarf zuerst Abhängigkeiten installieren: cd docs && npm install.
PHP CodeSniffer schlägt fehl
Der Hook gibt den Fix-Befehl für Ihre Container-Engine aus:
# Podman
podman exec -it zms-web bash -lc "./cli modules loop 'vendor/bin/phpcbf --standard=psr12 src/'"
# Docker
docker exec -it zms-web bash -lc "./cli modules loop 'vendor/bin/phpcbf --standard=psr12 src/'"Container nicht erkannt
Wenn eine Warnung erscheint, dass zms-web nicht läuft:
podman ps | grep zms-web
docker ps | grep zms-webDev-Umgebung bei Bedarf starten (DDEV und Devcontainer, Podman und Dev Containers). Ohne Container werden PHP-Prüfungen übersprungen; der Commit wird allein deshalb nicht wegen PHP blockiert.
Ungültiges Commit-Message-Format
Typische Fehler:
- Projekt fehlt:
feat: add feature - Projekt kleingeschrieben:
feat(zms-123): add feature - Doppelpunkt fehlt:
feat(ZMS-123) add feature
Korrekte Beispiele:
feat(ZMS-123): add featurechore(ZMSKVR): clean up
Merge durch commit-msg blockiert
Wenn git merge mit „Invalid commit message format“ und einem Subject wie Merge branch 'main' into … scheitert, .husky/commit-msg vom aktuellen main oder Feature-Branch holen (Merge-Subjects sollten erlaubt sein). Workaround mit konventioneller Message:
git commit -m "chore(ZMS): merge main into your-branch"Hooks umgehen
In Notfällen Git-Flag --no-verify verwenden:
git commit --no-verify -m "feat(ZMS-123): urgent fix"CAUTION
--no-verify nur im Notfall nutzen. Umgangene Hooks können die Codequalität verschlechtern und andere Entwickler betreffen.