Skip to content

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:

bash
npm install

Das 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; Frontend-ESLint nutzt zmsadmin, zmsstatistic, zmscalldisplay und zmsticketprinter; 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/ESLint/PHP läuft.

commit-msg ​

Alle Prüfungen laufen in diesem Hook, in Fail-Fast-Reihenfolge:

  1. Commit-Message — Subject aus der Message-Datei, die Git übergibt
  2. Vue-Code-Stil — Prettier-Check in zmscitizenview (npm run lint)
  3. Docs-Formatierung — Prettier-Check in docs/ (npm run format:check)
  4. Frontend-ESLint — npm run lint in gestagtem JS von zmsadmin, zmsstatistic, zmscalldisplay und zmsticketprinter (über zms-web, sonst auf dem Host)
  5. PHP-Code-Stil — PHP CodeSniffer (PSR-12) über alle PHP-Module im Container zms-web
  6. PHP Mess Detector — PHPMD mit Root-phpmd.rules.xml (Komplexität, Größe, Unused) über zms-web — wie CI php-code-quality

Container-Erkennung

ESLint und die PHP-Prüfungen erkennen die Laufzeit automatisch:

  • Podman — wenn ein Container zms-web läuft
  • Docker — Fallback, wenn Podman nicht verfügbar ist
  • ESLint-Fallback — ohne Container läuft ESLint auf dem Host
  • PHP überspringen — wenn kein Container läuft (nur Warnung, nicht blockierend)

Verhalten

  • Commit-Message-, Vue-, Docs- und ESLint-Prüfungen blockieren den Commit bei Fehlern
  • ESLint läuft nur, wenn in diesen vier Modulen JS, eslint.config.* oder package.json / package-lock.json gestagt ist
  • PHP-Prüfungen (PHPCS + PHPMD) nur bei gestagter .php-Datei oder phpmd.rules.xml und laufendem zms-web; reine JS-Dateien in PHP-Modulen lösen phpcs/phpmd nicht aus

Siehe auch Code-Formatierung für manuelle PHPCS-/Prettier-Befehle.

Commit-Message-Format (Schritt 1):

txt
type(PROJECT-123): commit message
type(PROJECT): commit message
type(PROJECT-1 PROJECT-2): commit message
type(PROJECT-1 PROJECT-2): type(PROJECT-3): commit message

Die Ticketnummer ist optional — PROJECT-123 oder nur PROJECT (Großbuchstaben). Mehrere Tickets/Projekte dürfen in einem Scope durch Leerzeichen getrennt stehen; mehrere type(scope):-Präfixe dürfen vor der Zusammenfassung verkettet werden.

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 ​

bash
cd zmscitizenview
npm run format

Danach erneut committen.

Docs-Formatierung schlägt fehl ​

Wenn Prettier unter docs/ Fehler meldet:

bash
cd docs
npm run format

Bei Bedarf zuerst Abhängigkeiten installieren: cd docs && npm install.

Frontend-ESLint schlägt fehl ​

Das gestagte Modul korrigieren (zmsadmin bei Bedarf ersetzen):

bash
podman exec -it zms-web bash -lc "cd zmsadmin && npm run fix"

Oder auf dem Host: cd zmsadmin && npm run fix. Danach erneut committen.

PHP CodeSniffer schlägt fehl ​

Der Hook gibt den Fix-Befehl für Ihre Container-Engine aus:

bash
# 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/'"

PHPMD schlägt fehl ​

Denselben Befehl wie in CI erneut ausführen (Repo-Root im Container zms-web):

bash
# Podman
podman exec -it zms-web bash -lc "./cli modules loop 'vendor/bin/phpmd src/ text ../phpmd.rules.xml'"

# Docker
docker exec -it zms-web bash -lc "./cli modules loop 'vendor/bin/phpmd src/ text ../phpmd.rules.xml'"

Schwellenwerte und Regeln: phpmd.rules.xml.

Container nicht erkannt ​

Wenn eine Warnung erscheint, dass zms-web nicht läuft:

bash
podman ps | grep zms-web

Dev-Umgebung bei Bedarf starten (Devcontainer und Podman, 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 feature
  • chore(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:

bash
git commit -m "chore(ZMS): merge main into your-branch"

Hooks umgehen ​

In Notfällen Git-Flag --no-verify verwenden:

bash
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.

Verwandte Dokumentation ​