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 imPATHvorhanden sein, und eine gültige Lizenz muss verfügbar sein. Ohne Lizenz beendet sich jeder CLI-Befehl mit Exit-Code6, 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:
chmodist 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 Ordnerhooks/), setzen Sie das Executable-Bit mitgit update-index --chmod=+x hooks/pre-commit. Einen nicht versionierten.git/hooks/pre-commitfü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 lautetc#(er stammt aus deridentify-Bibliothek, die pre-commit verwendet) und braucht wegen des#die Anführungszeichen. Wenn Sie nicht von Typ-Tags abhängen möchten, nutzen Sie stattdessenfiles: '\.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.