EMZETT.
Giriş yap

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.yaml içinde, kurulum pre-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/debugger yok.

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