Skip to content

Pre-Commit-Hooks

CodeCharter schon lokal vor dem Commit laufen lassen.

Wir empfehlen CodeCharter im CI als verbindliches Gate und den Pre-Commit-Hook als schnellen lokalen Vorab-Check. Den Hook lokal zu nutzen ist optional, spart aber Iterationszeit, weil Sie nicht erst auf den CI-Build warten müssen, um zu sehen, ob die Konvention eingehalten ist.

Voraussetzungen: Die codecharter-CLI muss installiert und im PATH vorhanden sein, und eine gültige Lizenz muss verfügbar sein. Ohne Lizenz beendet sich jeder CLI-Befehl mit Exit-Code 6, der Hook würde also jeden Commit blockieren. Installations-Anleitung: Installation.

Mit Git-Hooks direkt

.git/hooks/pre-commit:

#!/bin/sh

# Analysiert die gestagten Änderungen; nur Errors blockieren den Commit.
# --diff - begrenzt Findings und das --fail-on-Gate auf geänderte Zeilen.
git diff --cached --unified=0 | codecharter analyze MySolution.sln --diff - --fail-on error || {
    echo ""
    echo "❌ CodeCharter found blocking issues."
    echo "Run 'codecharter analyze MySolution.sln' for details, or commit with --no-verify if you really want."
    exit 1
}

Der Report zeigt weiterhin Findings aller Schweregrade in den geänderten Zeilen; --fail-on error entscheidet nur, welche davon den Commit blockieren. Beachten Sie: Ohne --fail-on beendet sich analyze bei jedem Finding mit Exit-Code 1, auch bei info. Setzen Sie --fail-on in Hooks, die auf den Exit-Code angewiesen sind, deshalb immer explizit.

In einer bestehenden Codebasis halten Sie den aktuellen Stand einmalig mit codecharter analyze MySolution.sln --write-baseline codecharter.baseline.json fest und ergänzen den Hook um --baseline codecharter.baseline.json. Dann blockieren nur noch neue Findings den Commit.

chmod +x .git/hooks/pre-commit.

Windows-Hinweis: chmod ist auf NTFS wirkungslos. Die Hook-Datei wird zwar angelegt, ist aber im Git-Index nicht als ausführbar markiert. Für einen Hook, der im Repository versioniert ist (z.B. im Ordner hooks/), setzen Sie das Executable-Bit mit git update-index --chmod=+x hooks/pre-commit. Einen nicht versionierten .git/hooks/pre-commit führt Git for Windows (Git Bash) normalerweise trotzdem aus, unabhängig von der NTFS-Berechtigung.

Mit pre-commit (das Python-Tool)

Wenn Sie pre-commit sowieso nutzen, .pre-commit-config.yaml:

repos:
  - repo: local
    hooks:
      - id: codecharter-analyze
        name: CodeCharter analyze
        entry: codecharter analyze MySolution.sln --fail-on error
        language: system
        pass_filenames: false
        types: ['c#']

Hinweis zu types: ['c#']: Der Typ-Tag für C#-Dateien lautet c# (er stammt aus der identify-Bibliothek, die pre-commit verwendet) und braucht wegen des # die Anführungszeichen. Wenn Sie nicht von Typ-Tags abhängen möchten, nutzen Sie stattdessen files: '\.cs$'.

Mit Husky (Node.js)

Für JS/TS-Repos, die zufällig auch C# haben, oder gemischte Teams:

.husky/pre-commit:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

codecharter analyze MySolution.sln --fail-on error

Hook nur bei C#-Änderungen ausführen

Eine volle Analyse vor jedem Commit kann auf großen Solutions länger dauern. Sparen Sie sich den Lauf, wenn der Commit keine .cs-Dateien betrifft:

#!/bin/sh
CHANGED=$(git diff --cached --name-only --diff-filter=ACMR -- '*.cs')
if [ -z "$CHANGED" ]; then
    exit 0
fi
codecharter analyze MySolution.sln --fail-on error

Empfohlene Strategie

Schritt Hook
pre-commit Diff-Scope: git diff --cached --unified=0 \| codecharter analyze MySolution.sln --diff - --fail-on error
pre-push codecharter analyze MySolution.sln --fail-on error (Dauer abhängig von der Solution-Größe)
CI codecharter analyze MySolution.sln --fail-on error (immer)

So bleibt der Hook im Hot Path auf das beschränkt, was der Commit tatsächlich ändert, und Sie fangen grobe Fehler ab, ohne dass jeder Commit auf eine volle Analyse warten muss.