Git hook’ları ve pre-commit: commit öncesi otomatik denetimler
Kısaca: Git hook’ları belirli olaylarda, örneğin bir commit’ten önce, betikler çalıştırır; böylece biçimlendirme, lint, testler ve sır taramaları otomatik olarak zorunlu kılınabilir.
Biraz daha ayrıntılı: Hataları erken bulmak zaman kazandırır. Git hook’ları, Git’in olaylarda başlattığı .git/hooks/ klasöründeki betiklerdir: pre-commit, commit-msg, pre-push, post-merge ve diğerleri. Bir hook hata kodu döndürürse Git eylemi iptal eder.
Ayrıntılı
Örnek: kendi hook’u
#!/bin/sh
npm run lint --silent || {
echo "Lint hataları: commit iptal edildi"; exit 1;
}Sorun: .git/hooks sürümlenmez ve ekiple paylaşılmaz. Daha iyisi: hook’ları depodan kuran bir araçla yönetin.
Araçlar
- pre-commit (Python tabanlı, dilden bağımsız): yapılandırma
.pre-commit-config.yamliçinde, kurulumpre-commit install; Black, Ruff, Prettier, ESLint, shellcheck, gitleaks, sondaki boşluklar ve çok daha fazlası için hook’lar. - Husky + lint-staged (JavaScript): yalnızca değişen dosyaları denetler.
- Lefthook (hızlı, Go).
- Git yapılandırmasında: klasör depodaysa
git config core.hooksPath .githooks.
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.5.0
hooks: [{id: ruff}, {id: ruff-format}]
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks: [{id: gitleaks}]Neler denetlenmeli
- Biçimlendirme ve lint (hızlı tutun ki kimse hook’ları atlamasın).
- Sırlar (gitleaks) ve büyük dosyalar.
- Commit iletileri (commit-msg, Conventional Commits).
- Push’tan önce hızlı testler (
pre-push). - Birleştirme çakışması işaretleri yok,
console.log/debuggeryok.
Yavaş denetimler (tam test paketi) CI’a aittir.
Sınırlar
Hook’lar yerel ve atlatılabilirdir (git commit --no-verify); bu yüzden CI’ın ve sunucu kurallarının (dal koruması, gerekli denetimler, gerekli incelemeler) yerini tutmaz. Hataları erken görünür kılan bir kolaylıktır. Onları hızlı tutun (birkaç saniyenin altında), kurulumu README’de belgeleyin ve CI’da yeniden denetleyin.
Ayrıca bak: CI/CD ardışık düzeni, Conventional Commits, Sırları yönetmek