İçindekiler
- Kısa Cevap
- Özellik Karşılaştırması
- Kurulum ve Başlangıç Kolaylığı
- Çoklu Dil ve Monorepo Desteği
- Konfigürasyon, Sürüm Kontrolü ve Tekrarlanabilirlik
- CI Entegrasyonu ve Tüm Dosyalarda Çalıştırma
- Performans, Paralel Çalışma ve Büyük Reposlar
- Güvenlik, Gizlilik ve Bağımlılıklar
- Sonuç: Hangisini Seçmelisin?
- Sıkça Sorulan Sorular
Git hook'ları ve pre-commit framework'leri, commit/push öncesi kod kalitesi kontrolleri, formatlama ve güvenlik taramaları gibi rutinleri otomatikleştirmek için harika. Bu yazıda "Git hooks framework'leri" ana anahtar kelimesi bağlamında, en çok kullanılan iki ücretsiz çözüm — pre-commit ve Husky — arasındaki farkları, güçlü ve zayıf yönleriyle açıklıyoruz.
Husky, Node ekosistemine yakın projeler için popüler bir seçimken; pre-commit daha dil-agnostik, özellikle çoklu dil ve monorepo yapılarında avantaj sağlıyor. Ayrıca yazıda üçüncü bir seçenek olarak sıkça karşılaşılan Lefthook'a kısa notlar ekliyorum; ama karşılaştırma tablosu ve kazanan kararlarını pre-commit ve Husky üzerinden veriyorum.
Kısa Cevap
- Durum: pre-commit
- Durum: Husky
Özellik Karşılaştırması
| Özellik | pre-commit | Husky |
|---|---|---|
| Hedef ekosistem | Dil-agnostik, Python tabanlı yönetim | Node / JavaScript / TypeScript projelerine doğal uyum |
| Kurulum | pip veya sistem paketleriyle; konfigürasyon .pre-commit-config.yaml | npm/yarn pnpm ile package.json veya Husky config ile |
| Konfigürasyon formatı | YAML (hook repo tanımları, versiyon pinleme) | package.json veya .husky dizini, shell/js script çağrıları |
| Çoklu dil & monorepo | Çok kuvvetli (çeşitli hook repo'ları, language-specific hooklar) | Node tabanlı araçlara güçlü; diğer diller için ek betikler gerekebilir |
| CI ve repeatable run | pre-commit run --all-files ile aynı davranış CI'da kolay tekrarlanır | CI için script eklemek gerekebilir; genelde node context bekler |
| Performans ve paralelleştirme | Hook'lar genelde tekil süreçler; cache ve repo-özgü optimizasyonlar | Hızlı, hafif; fakat scriptlerin kendine bağlı performansı etkiler |
| Topluluk & eklenti ekosistemi | Geniş, özellikle Python ve genel amaçlı hook repo'ları | Büyük Node topluluğu, JS araçlarıyla derin entegrasyon |

Kurulum ve Başlangıç Kolaylığı
pre-commit'ın kurulumu Python ortamına dayanır: pip veya sistem paket yöneticisiyle yükleme ardından .pre-commit-config.yaml ekleyerek çeşitli hook repo'larını tanımlarsın. Tek satırlık bir kurulumdan sonra geliştiricinin yerel ortamına git hook'ları otomatik kurulur. Birden fazla dilin olduğu projelerde, hazır hook'lar sayesinde hızlıca kapsamlı kurallar koyabilirsin.
Husky ise npm/yarn/pnpm üzerinden kurulur ve özellikle JavaScript geliştiricileri için doğal bir akış sunar: package.json içine script eklemek veya .husky dizininde shell komutları tanımlamak yeterli. Node projelerinde başlangıç daha hızlı ve daha tanıdık hissettirir.
Kazanan: Berabere
Çoklu Dil ve Monorepo Desteği
Eğer repo içinde JavaScript dışında Python, Go, Rust gibi diller de kullanıyorsan pre-commit daha rahat bir seçenek olur. pre-commit için yazılmış çok sayıda hazır hook (ör. black, isort, flake8, golangci-lint, cargo fmt) var; bunları YAML ile pinleyip tek merkezden yönetebilirsin. Monorepo yapılarında her paket için ayrı config veya ortak config ile kontrol sağlamak mümkün.
Husky temelde Node tabanlı komutları çalıştırmak için pratik; fakat diğer dillerdeki araçları çalıştırmak için shell script yazman gerekir. Yani çok dilli projelerde ek yapılandırma ve bakım gerekebilir. Bu noktada Lefthook, hem Ruby/Go/Node projelerinde kullanım kolaylığı ve paralel çalışma seçenekleriyle bir alternatif olarak öne çıkıyor.
Kazanan: pre-commit
Konfigürasyon, Sürüm Kontrolü ve Tekrarlanabilirlik
pre-commit konfigürasyonu .pre-commit-config.yaml dosyasında tutulur; hook'ların kaynak repository'leri ve versiyon etiketleri açıkça pinlenir. Bu, aynı konfigürasyonun CI ve geliştirici makinelerinde aynı şekilde çalışmasını kolaylaştırır. Ayrıca pre-commit cache ve repo tabanlı hook yönetimi sayesinde tekrarlanabilirlik yüksektir.
Husky'de konfigürasyon genelde package.json veya .husky dizininde yer alır; script'lerin ve bağımlılıkların package.json içinde versiyonlanması önemli. Node ekosisteminde package-lock/pnpm-lock ile sürümlerin sabitlenmesi mümkün olsa da, farklı makinelerde Node sürümü ve sistem bağımlılıkları farklı davranışlara yol açabilir. Yine de JS projelerinde Husky ile sürümlü, tekrarlanabilir akış kurmak gayet mümkün.
Kazanan: pre-commit
CI Entegrasyonu ve Tüm Dosyalarda Çalıştırma
pre-commit, CI pipeline'larında kullanılmak üzere tasarlanmış komutlar sunar (ör. pre-commit run --all-files). Bu sayede commit öncesi yapılan kontrollerin CI'da da birebir uygulanması kolaydır; hataların lokalda gizlenme riski azalır. Ayrıca birçok popüler CI ortamı için hazır kurulum örnekleri bulunuyor.
Husky daha çok yerel hook'lar için odaklanır; CI tarafında script'leri manuel olarak çağırman (ör. npm run lint) yaygındır. Bu, esneklik sağlasa da farklı aşamalarda farklı komutların çalıştırılması yüzünden tutarsızlığa yol açabilir. Küçük takımlar için bu esneklik olumlu olabilir; ancak büyük ekiplerde pre-commit'in CI tekrar çalıştırma kolaylığı avantaj sağlar.
Kazanan: pre-commit
Performans, Paralel Çalışma ve Büyük Reposlar
pre-commit hook'ları genelde bağımsız süreçler olarak çalışır; bazı hook'lar uzun sürebilir ancak cache ve sadece değişen dosyaları işleme seçenekleri performansı iyileştirir. Büyük monorepo'larda uygun yapılandırma ile yalnızca ilgili paketlerde çalıştırma sağlanabilir.
Husky'nın performansı büyük ölçüde çalıştırdığın script'lere bağlıdır. JS araçları genellikle hızlıdır; ancak büyük repo işlemlerinde uygun önlemler (yalnızca değişen dosyalar üzerinde çalıştırma) alınmazsa yavaşlama görülebilir. Lefthook burada alternatif olarak paralel job çalıştırma ve hızlı önbellekleme imkanları sunduğu için bazı ekiplerin tercihidir.
Kazanan: Berabere
Güvenlik, Gizlilik ve Bağımlılıklar
pre-commit üçüncü taraf hook'ları repository olarak çeker; bu nedenle hangi hook'un ne yaptığını konfigürasyonda netleştirmek ve yalnızca güvenilir kaynakları kullanmak önemlidir. pre-commit'in offline çalışması için önceden hook'ları önbelleğe almak mümkündür; yine de ilk kurulum internet gerektirir.
Husky ise doğrudan repository içindeki script'leri çalıştırabileceği gibi npm paketlerine bağımlı olabilir. Node paketleri üzerinden gelen riskler ve package manager saldırılarına karşı dikkatli olmak gerekir. Her iki araç da güvenlik açısından dikkat gerektirir; policy ve kod incelemesiyle riskler yönetilebilir.
Kazanan: Berabere
Sonuç: Hangisini Seçmelisin?
| Senin durumun | Önerimiz |
|---|---|
| Tek dil, Node/JS/TS projesi, hızlı başlangıç istersin | Husky |
| Çok dilli repo, monorepo veya CI'da birebir kontrol istersin | pre-commit |
| Küçük ekip, Node araçlarıyla sıkı entegre ve package.json üzerinden yönetmek istersin | Husky |
| Birleşik, dil-agnostik hook yönetimi ve hazır hook ekosistemi istersin | pre-commit |
Ek not: Lefthook, Husky ve pre-commit arasında performans ve paralel çalışma açısından tercih edilen bir üçüncü alternatiftir; Node odaklı olmayan ekiplerde Lefthook hızlı ve esnek bir çözüm sunabilir. Ayrıca birçok ekip, Husky'yi lokal geliştirme için, pre-commit'i CI ve çok dilli kontroller için birlikte kullanmayı tercih ediyor.
Sıkça Sorulan Sorular
pre-commit ve Husky aynı anda kullanılabilir mi?
Evet; örneğin Husky ile yerel npm script'lerini tetiklerken, pre-commit'i kod formatlama ve dil-agnostik kontroller için CI ve yerelde kullanabilirsin. İkisini birlikte kullanmak, her aracın güçlü yönlerinden faydalanmanı sağlar.
Hangi araç daha az bağımlılık gerektirir?
Husky Node ekosisteminde çalıştığı için proje zaten Node bağımlısıysa ekstra büyük bağımlılıklar getirmez; pre-commit ise Python ortamına ihtiyaç duyar. Hangi araç daha az ek bağımlılık getirir sorusunun cevabı projendeki mevcut ekosisteme bağlıdır.
Lefthook neden bahsediliyor, onu tercih etmeli miyim?
Lefthook, özellikle paralel çalıştırma, çeşitli dillerde basit kurulum ve yüksek performans isteyen ekipler tarafından tercih ediliyor. Eğer hem Node hem diğer dillerde hızlı hook çalıştırma istiyorsan Lefthook'u incelemeye değer.
pre-commit hook'larını nasıl pinlerim?
.pre-commit-config.yaml içinde kullanılan hook'ların kaynak repository URL'leri ve sürüm etiketleri (ör. rev: vX.Y.Z) ile pinleyebilirsin. Bu, tüm geliştiricilerin ve CI'nın aynı versiyonları kullanmasını sağlar.
Husky, Windows ve macOS'ta stabil çalışır mı?
Evet; Husky, shell script veya Node script'ler çalıştırabildiği sürece Windows, macOS ve Linux'ta kullanılabilir. Windows üzerinde shell uyumsuzlukları olursa PowerShell veya cross-platform script araçları kullanılabilir.
Artıları
- Özetle: Tek dilli ve Node odaklı projelerde Husky; çoklu dil, monorepo ve CI-tutarlılığı ön planda ise pre-commit genelde daha uygundur.
Eksileri
- Her iki aracın da güvenlik ve bağımlılık yönetimi konularında dikkat gerektirdiğini unutma; üçüncü taraf hook'ları ve paketleri incelemeden kullanma.
