Git Hooks Automatisierung
Git Hooks: Workflow automatisieren
Git Hooks führen automatisch Scripts bei Git-Aktionen aus. Perfekt für Linting, Tests und Code-Qualität.
Verfügbare Hooks
| Hook | Wann | Verwendung |
|---|---|---|
| pre-commit | Vor Commit | Linting, Formatting |
| prepare-commit-msg | Commit-Message vorbereiten | Template einfügen |
| commit-msg | Nach Message-Eingabe | Message validieren |
| pre-push | Vor Push | Tests ausführen |
| post-merge | Nach Merge | Dependencies installieren |
Hook erstellen (manuell)
# Hooks liegen in .git/hooks/
cd .git/hooks
# Beispiel: pre-commit
cat > pre-commit << 'EOF'
#!/bin/sh
echo "Running pre-commit checks..."
# Linting
npm run lint
if [ $? -ne 0 ]; then
echo "Lint errors found. Commit aborted."
exit 1
fi
# Tests
npm test
if [ $? -ne 0 ]; then
echo "Tests failed. Commit aborted."
exit 1
fi
echo "All checks passed!"
exit 0
EOF
# Ausführbar machen
chmod +x pre-commit
Husky (empfohlen für Node.js)
# Installation
npm install husky --save-dev
npx husky init
# Pre-commit Hook
echo "npm run lint" > .husky/pre-commit
# Pre-push Hook
echo "npm test" > .husky/pre-push
# Commit-Message Validierung
npm install @commitlint/cli @commitlint/config-conventional --save-dev
# commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional']
};
# Hook erstellen
echo "npx commitlint --edit \$1" > .husky/commit-msg
lint-staged
# Nur geänderte Dateien linten
npm install lint-staged --save-dev
# package.json
{
"lint-staged": {
"*.{js,ts}": ["eslint --fix", "prettier --write"],
"*.css": ["stylelint --fix"],
"*.{json,md}": ["prettier --write"]
}
}
# .husky/pre-commit
npx lint-staged
Pre-push: Tests ausführen
#!/bin/sh
# .husky/pre-push
echo "Running tests before push..."
# Nur wenn main/master
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" = "main" ] || [ "$branch" = "master" ]; then
npm test
if [ $? -ne 0 ]; then
echo "Tests failed! Push aborted."
exit 1
fi
fi
exit 0
Commit-Message Format
# Conventional Commits
# type(scope): description
# Types:
# feat: Neue Feature
# fix: Bug Fix
# docs: Dokumentation
# style: Formatting (kein Code-Change)
# refactor: Code-Änderung ohne Feature/Fix
# test: Tests hinzufügen
# chore: Build, Dependencies, etc.
# Beispiele:
feat(auth): add password reset functionality
fix(api): handle null response from server
docs(readme): update installation instructions
refactor(user): extract validation logic
# commit-msg Hook zur Validierung
#!/bin/sh
# .husky/commit-msg
commit_regex='^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,72}$'
commit_msg=$(cat "$1")
if ! echo "$commit_msg" | grep -Eq "$commit_regex"; then
echo "Invalid commit message format!"
echo "Expected: type(scope): description"
echo "Example: feat(auth): add login feature"
exit 1
fi
Hooks mit Team teilen
# Problem: .git/hooks ist nicht im Repository
# Lösung 1: Husky (empfohlen)
# Hooks in .husky/ werden automatisch installiert
# Lösung 2: Custom Scripts Directory
# scripts/hooks/ im Repo, dann:
git config core.hooksPath scripts/hooks
# Lösung 3: Symlinks (Makefile)
# Makefile
setup:
ln -sf ../../scripts/hooks/pre-commit .git/hooks/pre-commit
ln -sf ../../scripts/hooks/commit-msg .git/hooks/commit-msg
PHP: Pre-commit mit Composer
{
"scripts": {
"lint": "php-cs-fixer fix --dry-run --diff",
"test": "phpunit",
"pre-commit": [
"@lint",
"@test"
]
}
}
# .git/hooks/pre-commit
#!/bin/sh
composer run pre-commit
Python: pre-commit Framework
pip install pre-commit
# .pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- repo: https://github.com/psf/black
rev: 24.1.0
hooks:
- id: black
- repo: https://github.com/PyCQA/flake8
rev: 7.0.0
hooks:
- id: flake8
# Installieren
pre-commit install
# Manuell ausführen
pre-commit run --all-files
Hook umgehen (Notfall)
# Wenn nötig (selten verwenden!) git commit --no-verify -m "Emergency fix" git push --no-verify
💡 Tipp:
Halten Sie Pre-commit Hooks schnell (< 10 Sekunden). Langsame Checks gehören in CI/CD oder Pre-push.