# Git Hooks

Dieses Projekt verwendet Git Hooks, um Code-Quality und Commit-Standards automatisch zu ?berpr?fen.

## Aktivierte Hooks

### Pre-commit Hook
**Zweck**: Schnelle Checks vor jedem Commit

**Pr?ft**:
- ? PHP Code Style (PHP-CS-Fixer) f?r ge?nderte PHP-Dateien
- ? JavaScript/TypeScript Linting (ESLint) f?r ge?nderte JS/TS-Dateien
- ? Merge-Konflikt-Marker in staged Dateien

**?berspringen**: `git commit --no-verify`

**Beispiel-Fehler**:
```
? Code style issues found in src/MyClass.php
?? Run: make cs-fix
```

### Commit-msg Hook
**Zweck**: Validierung der Commit-Message nach Conventional Commits

**Format**: `type(scope): subject`

**Erlaubte Types**:
- `feat`: Neue Features
- `fix`: Bugfixes
- `docs`: Dokumentation
- `style`: Code-Formatierung (ohne Funktions?nderung)
- `refactor`: Code-Refactoring
- `perf`: Performance-Verbesserungen
- `test`: Tests hinzuf?gen/?ndern
- `build`: Build-System/Abh?ngigkeiten
- `ci`: CI/CD Konfiguration
- `chore`: Sonstige ?nderungen
- `revert`: Revert eines Commits

**Beispiele**:
```bash
feat: Add user authentication
fix(api): Resolve 502 error in staging
docs: Update README
refactor(framework): Improve DI container
```

**?berspringen**: `git commit --no-verify`

### Pre-push Hook
**Zweck**: Langsamere Checks vor dem Push

**Pr?ft**:
- ? PHPStan Static Analysis
- ? Unit Tests (schneller Teil der Test-Suite)

**Hinweis**: Dieser Hook kann etwas l?nger dauern. Er fragt bei Fehlern, ob trotzdem gepusht werden soll.

**?berspringen**: `git push --no-verify`

## Hook deaktivieren

### Einzelnen Commit ?berspringen
```bash
git commit --no-verify
```

### Einzelnen Push ?berspringen
```bash
git push --no-verify
```

### Hooks komplett deaktivieren
```bash
# Tempor?r alle Hooks deaktivieren
git config core.hooksPath /dev/null

# Wieder aktivieren
git config --unset core.hooksPath
```

## Hook manuell testen

```bash
# Pre-commit Hook testen
.git/hooks/pre-commit

# Commit-msg Hook testen
echo "test: Test message" | .git/hooks/commit-msg /dev/stdin

# Pre-push Hook testen
.git/hooks/pre-push
```

## Hook anpassen

Die Hook-Dateien befinden sich in `.git/hooks/`:
- `.git/hooks/pre-commit` - Pre-commit Checks
- `.git/hooks/commit-msg` - Commit-Message Validierung
- `.git/hooks/pre-push` - Pre-push Checks

**Wichtig**: Hook-Dateien werden nicht ins Repository committed (sie sind in `.git/hooks/`, nicht im Working Directory).

Um Hooks f?r das gesamte Team zu teilen, gibt es mehrere M?glichkeiten:
1. **Husky** (npm package) - f?r Node.js-Projekte
2. **CaptainHook** (PHP package) - f?r PHP-Projekte
3. Manuelles Setup-Skript

## Best Practices

1. **Pre-commit**: Schnelle Checks (< 5 Sekunden)
   - Code Style
   - Syntax-Checks
   - Merge-Konflikt-Detection

2. **Pre-push**: Langsamere Checks (< 2 Minuten)
   - Static Analysis
   - Unit Tests
   - Integration Tests (optional)

3. **CI/CD**: Umfassende Checks
   - Alle Tests
   - Coverage Reports
   - Security Scans

## Troubleshooting

### Hook wird nicht ausgef?hrt
```bash
# Pr?fe Berechtigungen
ls -la .git/hooks/

# Mache Hook ausf?hrbar
chmod +x .git/hooks/pre-commit
```

### Hook ist zu langsam
- Verringere die Anzahl der Checks im pre-commit Hook
- Verschiebe langsamere Checks in den pre-push Hook
- Nutze `--no-verify` f?r schnelle WIP-Commits

### Hook schl?gt im Docker fehl
Die Hooks pr?fen automatisch, ob sie in Docker laufen und passen die Befehle entsprechend an.

## Weitere Hooks hinzuf?gen

Weitere n?tzliche Hooks:
- `post-merge`: Automatische `composer install` nach `git pull`
- `post-checkout`: Automatische Dependency-Updates
- `prepare-commit-msg`: Automatische Ticket-Nummern in Commit-Messages
