Simge Şen
4 min readMay 31, 2019

Git Hooks

Git Hooks Nedir ?

Sürüm kontrol sistemi olan Git kullanımında; commit, push ve receive gibi komutların kullanımından önce veya sonra yürütülen özel komut dosyalarına ‘Git Hooks’ adı verilir.

Git Hookslar kullanım içeriğinin değiştirilmesine ve düzenlenmesine imkan sağlarlar. Git Hooks dosyaları içindeki içerikler ve scriptler değiştirilerek projelerdeki git kullanımına ilişkin istenilen özelliklerin esnek ve kullanışlı bir yapı halini almasını sağlayabilirler.

GİT HOOKS DOSYALARINA ERİŞİM
Projede git sürüm kontrol sisteminin kullanıldığı varsayılarak proje dizininde klasörüne girilir.
$ cd ./git/hooks
$ ls
ls komutu ile listelemenin ardından git hooks özel komut dosyaları aşağıdaki gibidir :

applypatch-msg

Commit mesaj dosyasını düzenleyebilir ve genellikle bir ek mesajının bir projenin standartlarına uygun biçimde doğrulamak veya aktif olarak biçimlendirmek için kullanılır.

git am komutu çalıştırıldığında çalışır.

Tek bir değişken alır. Bu değişken tasarlanan(önerilen) ilk commit mesaj iletisini içeren geçici dosyanın adıdır.

pre-applypatch

git am komutu tarafından çağrılır.

Parametre almaz ve düzeltme eki uygulandıktan sonra ancak bir işlem yapılmadan önce çağrılır.

Projenin çalışan mevcut hiyerarşisini denetlemek ve projede belirlenen bir testin geçilmemesi dahilinde commit edilmesini reddetmek için kullanılabilir.

pre-commit

git commit komutu tarafından çağırılır.

Parametre almaz. Commit mesajı atılmadan önce commitlerin içeriklerinin kontrol edilmesini sağlayan hooktur.

Örneğin bir senaryo kurgulayacak olursak ; bu hook etkinleştirildiğinde white space adı verilen boşluk yapısının kontrolünü yaparak bu karaktere sahip satırların girişini yakalayıp ; bu tarz atılan commitleri iptal eder veya test işlemleri için scriptler yazılarak teste uygun olmayan commit mesajlarını iptal eder.

prepare-commit-msg

git commit komutu çalıştırıldığında mesajın girileceği editor açılmadan önce çalıştırılır, 1 ila 3 arasında girdi alabilir:

1- mesajın bulunduğu geçici alan,

2- commit in türü (git commit ten sonra -m, -t girildiyse yada merge işlemi yapıldıysa bu bilgi olur)

3- SHA1 git commit -c olarak çağırıldıysa commitin özet değeri

Örnek bir senaryo olarak ; elektronik postalardaki otomatik imza gibi bir metnin (mesela isim soyisim gibi) bütün commit mesajlarına eklenmesi verilebilir.

commit-msg

git commit komutu kullanıldığında çalışır.

Bir standarda uygunluğu sağlamak veya herhangi bir kritere göre reddetmek için, düzenlendikten sonra commit mesajını ayarlamak için kullanılabilir.

Bu hooka iletilen tek argüman mesajı içeren dosyanın adıdır.
Commit-msg hook, Prep-commit-msg hook’a çok benzer, ancak kullanıcı bir commit mesajı girdikten sonra çağrılır.

Bu, geliştiricileri mesajlarının ekibinizin standartlarına uymadığı konusunda uyarmak için uygun bir kullanımdır. Kullanıcının girdiği mesajdan hoşlanmayan ekip lideri, bu dosyayı yerinde değiştirebilir (prep-commit-commit-msg ile olduğu gibi)

pre-rebase

Bu hook, git rebase komutunun herhangi bir şeyi değiştirmeden önce çağrılarak projedeki büyük sorunların ortaya çıkmasının engellenmesinde rol oynar.

Bu hook 1 ila 2 argüman alır, fork işleminde bir üst dalın ve geçerli dalın yeniden yapılandırılmasına ilişkindir. Current branch yapılandırılması rebase edilmesinde parametre değeri boştur.

Bu hooka ait bir senaryo bilgisi olarak ; rebase işlemine ne zaman izin verilip verilmeyeceğinin bilgisi söylenebilir. Yapılandırılan ve çalışılan branchın master branchla birleştirip birleştirilmeyeceğini kontrol eder ve çakışma(conflict) olduğu takdirde rebase işlemini oluşturmayı iptal eder.

pre-receive

git push komutu kullanıldığında çalıştırılır.

Bu hook, git push işlemi yapıldığında git-receive-pack tarafından çağrılır. Uzak sunucudaki repoları güncellemeye başlamadan hemen önce ön alım hooku başlatılır. Çıkış durumu, güncellemenin başarısını veya başarısızlığını belirler.

Herhangi bir argüman gerektirmez, ancak her bir işlem için güncellenmek üzere standart girdiden formatın bir satırını alır:
<old-value> SP <new-value> SP <ref-name> LF

Örnek bir senaryo olarak ; geliştiricilerin beğenilmeyen commit mesaj biçimlendirilmesini, yapılan içerik ve kod düzenlenmesinin beğenilmemesi dahilinde bu commitlerin ön alım ile reddedilerek projenin reposunda olması engellenir.

update

Bu hook pre-receive hookundan sonra çalıştırılır ve çalışma mantığı aynıdır. Eğer kullanıcı 4 branchı yollamaya çalışırsa güncelleme 4 defa yapılır.Pre-receive hookun aksine, bu hookun standart girdiden okuması gerekmez. Bunun yerine, aşağıdaki 3 argümanı kabul eder:

1- Güncellenmekte olan referansın adı
2- Referans içerisinde saklanan eski nesne adı
3- Referans içerisinde saklanan yeni nesne adı

post-commit

Bu hook, coomit-msg hookundan hemen sonra çağrılır. Git commit işleminin sonucunu değiştiremez, bu nedenle öncelikle bildirim amacıyla kullanılır.
Parametre ya da argüman almaz.

git log -1 HEAD komutu ile ; projenin master branchında olan tüm log yani atılan commit mesajlarının bilgisine ulaşılabilir.

Örnek bir senaryo olarak, her bir commit mesajının ardından ekip lideri ya da patrona e-posta göndermek istenirse bu hook kullanılabilir.

post-checkout

Bu hook, post-commit hookuna çok benzerdir; ancak git checkout ile bir referansı başarıyla kontrol ettiğinizde çağrılır. Bu, karışıklığa yol açacak dosyaların engellendiği için başarılıdır.

Bu hook üç parametre kabul eder ve çıkış durumunu git checkout komutunu etkilemez.

1- Önceki başlığın referansı
2- Yeni başlığın referansı
3- Eğer checkout branch komutu kullanılıyorsa 1 , dosya check işlemi mevcutsa 0 flag döndürülür.

Örneğin, tüm eklentilerin çekirdek kod tabanının dışında saklanması için bir eklenti branchı kullanılabilir. Bu eklentiler, diğer branchların ihtiyaç duymadığı çok sayıda ikili dosya gerektiriyorsa, bunları yalnızca eklentiler adına branch açılarak seçici bir şekilde oluşturulabilir.

Local Hooks

Local(yerel) hookslar geliştiricinin sadece kendi deposunda yaptığı değişiklerden oluşur. Dolayısıyla ekip halinde çalışılan bir projede local hooks sadece yerel depolarda yapılan değişikleri kapsayacağından ekibin tümüne etki edemez.

En çok kullanılan local hookslar:
- pre-commit
- prepare-commit-msg
- commit-msg
- post-commit
- post-checkout
- pre-rebase

pre ön komutlu hookslar gerçekleşmek üzere olan hareketin değiştirilmesine izin verirken ; post ön komutlu hookslar yalnızca bildirimler(notifications) için kullanılır.

ÖNEMLİ ; bir bilgi olarak eğer bu dosyaların içerikleri değiştirilecekse .sample uzantılı dosyaların kaldırılması gerekmektedir. Aksi halde .sample uzantılı dosyalar varsayılan olarak kabul görülüp yapılan değişiklikler geçerli olmayacaktır.

KAYNAKLAR :

https://git-scm.com/book/pl/v2/Customizing-Git-Git-Hooks