Artikel

Mit Pre-Commit-Hooks 3-fache Sicherheit

GitLinuxPHP

Beim Arbeiten mit Git kann es schnell passieren, dass fehlerhafter oder unsauberer Code in ein Repository gelangt. Um dies zu verhindern, können Pre-Commit-Hooks eingesetzt werden, die den Code automatisch vor jedem Commit prüfen.

In diesem Artikel zeige ich, wie du einen Pre-Commit-Hook einrichtest, der deine gestagten PHP-Dateien mit drei wichtigen Tools analysiert:

  • PHPStan – Findet potenzielle Fehler und sorgt für statische Code-Analyse.
  • PHPMD (PHP Mess Detector) – Hilft dabei, unsaubere Codestellen und Verstöße gegen Clean-Code-Prinzipien zu erkennen.
  • PHPCS (PHP CodeSniffer) – Stellt sicher, dass der Code den Coding-Standards entspricht (z. B. PSR-12).

Mit diesem Setup erhöhst du die Code-Qualität und verhinderst frühzeitig Fehler.

Installation der Tools

Die genannten Tools können über Composer als Entwicklungsabhängigkeiten installiert werden:

composer require --dev phpstan/phpstan
composer require --dev phpmd/phpmd
composer require --dev squizlabs/php_codesniffer

Dadurch stehen sie unter vendor/bin/ zur Verfügung und können direkt in einem Pre-Commit-Hook genutzt werden.

Einrichtung des Pre-Commit-Hooks

Erstelle oder bearbeite die Datei .git/hooks/pre-commit in deinem Git-Repository und füge den folgenden Code ein:

#!/bin/sh
#
# Pre-commit Hook zur Prüfung von PHP-Dateien mit PHPStan, PHPMD und PHPCS
#
# Stelle sicher, dass dieser Hook ausführbar ist:
# chmod +x .git/hooks/pre-commit

# Finde alle gestagten PHP-Dateien (nur neue, modifizierte oder kopierte Dateien)
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.php$')

# Falls keine PHP-Dateien gestaged sind, beende den Hook erfolgreich.
if [ -z "$STAGED_FILES" ]; then
    exit 0
fi

# Zeige die gestagten Dateien an
echo "Staged PHP files:"
echo "$STAGED_FILES"
echo ""

# 1. PHPStan ausführen
echo "Running PHPStan..."
vendor/bin/phpstan analyse $STAGED_FILES --level=max
if [ $? -ne 0 ]; then
    echo "PHPStan checks failed. Commit aborted."
    exit 1
fi

# 2. PHPMD ausführen
echo "Running PHPMD..."
vendor/bin/phpmd $STAGED_FILES text phpmd.xml
if [ $? -ne 0 ]; then
    echo "PHPMD checks failed. Commit aborted."
    exit 1
fi

# 3. PHPCS ausführen
echo "Running PHPCS..."
vendor/bin/phpcs --standard=PSR12 $STAGED_FILES
if [ $? -ne 0 ]; then
    echo "PHPCS checks failed. Commit aborted."
    exit 1
fi

echo "All checks passed!"
exit 0

Schritt-für-Schritt-Anleitung zur Aktivierung des Hooks

  1. Speichere den Code in der Datei .git/hooks/pre-commit im Stammverzeichnis deines Repositories.
  2. Mache die Datei ausführbar mit dem Befehl: chmod +x .git/hooks/pre-commit
  3. Teste den Hook, indem du eine PHP-Datei änderst, sie stagest (git add ausführst) und versuchst, sie zu committen.

Falls eine der Prüfungen fehlschlägt, wird der Commit verhindert, bis die Probleme behoben sind.

Vorteile dieses Setups

  • Automatische Code-Qualitätsprüfung: Fehlerhafte Commits werden verhindert.
  • Zeiteinsparung: Fehler werden früh erkannt, bevor sie ins Repository gelangen.
  • Standardisierung: Der Code bleibt einheitlich und entspricht den gewünschten Konventionen.

Mit diesem Pre-Commit-Hook stellst du sicher, dass alle gestagten PHP-Dateien vor jedem Commit überprüft werden, wodurch du langfristig eine höhere Code-Qualität und weniger Fehler erreichst.

0 Kommentare