Git
Chapters ▾ 2nd Edition

8.3 Git’i Özelleştirmek - Git Kancaları (Hooks)

Git Kancaları (Hooks)

Diğer Birçok Versiyon Kontrol Sistemi gibi, Git’in belirli önemli eylemler gerçekleştiğinde özel komut betiklerini tetikleme yöntemi vardır. Bu kancalar iki gruba ayrılır: istemci tarafı ve sunucu tarafı. İstemci tarafı kancaları, katkılama veya birleştirme gibi işlemlerle tetiklenirken; sunucu tarafı kancaları, itilen katkıları alma gibi ağ işlemlerinde çalışır. Bu kancaları her türlü amaç için kullanabilirsiniz.

Kanca Kurma

Kancalar, Git dizininin hooks alt dizininde saklanır. Çoğu projede bu .git/hooks yoludur. git init komutu ile yeni bir repo başlattığınızda, Git kancalar dizinini bir sürü örnek komut dosyasıyla doldurur. Bunların çoğu kendi başlarına kullanışlı olmakla birlikte, her bir komut dosyasının girdi değerlerini belgeledikleri için de yararlıdırlar. Tüm örnekler, içine biraz Perl serpiştirilmiş shell komut dosyaları olarak yazılmıştır, ancak uygun şekilde adlandırılmış yürütülebilir haldeki tüm komut dosyaları sorunsuz şekilde çalışacaktır (onları Ruby veya Python veya aşina olduğunuz başka bir dilde yazabilirsiniz). Birleştirilmiş kancaları kullanmak istiyorsanız, onları yeniden adlandırmanız gerekecektir (tüm dosya adları .sample ile biter).

Bir kancayı etkinleştirmek için, .git dizininin altındaki hooks alt dizinine uygun şekilde (herhangi bir dosya uzantısı olmadan) adlandırılmış ve yürütülebilir bir dosya koyun. Ve artık, çağrılabiliyor olması lazım. Burada önemli kancaların çoğuna değineceğiz.

İstemci-Tarafı Kancaları

Çok sayıda istemci tarafı kancası bulunmaktadır. Bu bölüm, katkı iş akışı kancalarını, e-posta iş akışı betiklerini ve diğer her şeyi ayırır.

Not

Önemli bir not olarak, istemci tarafı kancalarının bir repoyu klonladığınızda kopyalanmadığını bilmek çok önemlidir. Eğer bu betiklerle bir politika uygulamak gibi bir amacınız varsa, muhtemelen bunu sunucu tarafında yapmak isteyeceksiniz. Bunun için Bir Örnek: Mecburi Git Politikası bölümündeki örneğe bakın.

Katkı-İşakışı Kancaları

İlk dört kancanın hepsi katkı süreci ile ilgilidir.

pre-commit kancası siz daha katkı mesajını bile yazmadan önce çalıştırılır. Yapılacak olan katkıyı incelemek, bir şey unutup unutmadığınızı görmek, testlerin çalıştırılıp çalıştırılmadığını kontrol etmek veya kod içinde incelemek istediğiniz herhangi bir şeyi kontrol etmek için kullanılır. Bu kancadan sıfırsız (non-zero) çıkış yapmak katkıyı iptal eder, ancak git commit --no-verify ile bunu atlayabilirsiniz. Bununla, kod stili kontrol etmek (lint veya bir benzerini çalıştırmak), sondaki boşlukları kontrol etmek (varsayılan kanca tam olarak bunu yapar) veya yeni metodlarda uygun belgelendirmenin olup olmadığını kontrol etmek gibi şeyler yapabilirsiniz.

prepare-commit-msg kancası, katkı mesajı düzenleyici başlatılmadan önce, ancak varsayılan mesaj oluşturulduktan sonra çalıştırılır. Katkı yazarı mesajı görmeden önce varsayılan mesajı düzenlemenize izin verir. Bu kancanın birkaç parametresi vardır: şimdiye kadar katkı mesajını tutan dosyanın yolu, katkının türü ve eğer bu düzeltilmiş bir katkıysa katkı SHA-1’i gibi. Bu kanca genellikle normal katkılar için kullanışlı değildir; bunun yerine, varsayılan mesajın otomatik olarak oluşturulduğu katkılarda, örneğin şablonlu katkı mesajları, birleştirme katkıları, sıkıştırılmış katkılar ve düzeltilmiş katkılarda iyidir. Programlı olarak bilgi eklemek için bunu bir katkı şablonuyla birlikte kullanabilirsiniz.

commit-msg kancası, yine geliştirici tarafından yazılan katkı mesajını içeren geçici bir dosyanın yolunu içeren bir parametre alır. Bu betik sıfırsız olarak çıkarsa, Git katkı sürecini iptal eder. Bunu bir katkının gerçekleşmesine izin vermeden önce, proje durumunuzu veya katkı mesajınızı doğrulamak için kullanabilirsiniz. Bu bölümün sonunda, bu kancayı katkı mesajınızın gerekli bir modelle uyumlu olup olmadığını kontrol etmek için nasıl kullanacağımızı göstereceğiz.

Tüm katkı süreci tamamlandıktan sonra, post-commit kancası çalışır. Bu, herhangi bir parametre almaz, ancak git log -1 HEAD komutunu çalıştırarak en son katkıyı kolayca alabilirsiniz. Genellikle, bu betik bildirim veya benzeri bir şey için kullanılır.

E-posta İş-akışı Kancası

E-posta tabanlı bir iş akışı için üç istemci tarafı kancası kurabilirsiniz. Hepsi git am komutu tarafından çağrılır, bu yüzden iş akışınızda bu komutu kullanmıyorsanız, güvenle bir sonraki bölüme geçebilirsiniz. E-posta aracılığıyla hazırlanan git format-patch ile yama alıyorsanız, bunlardan bazıları size yardımcı olabilir.

Çalıştırılan ilk kanca `applypatch-msg`dir. Tek bir argüman alır: önerilen katkı mesajını içeren geçici dosyanın adı. Bu betik sıfırsız olarak çıkarsa, Git yamayı iptal eder. Bunu, bir katkı mesajının düzgün biçimlendirilmiş olup olmadığını veya betiği yerinde düzenleyerek mesajı normalleştirmek için kullanabilirsiniz.

pre-applypatch kancası git am ile yamaları uygularken çalıştırılan bir sonraki kancadır. Biraz kafa karıştırıcı bir şekilde, yama uygulandıktan sonra ancak bir katkı yapılmadan önce çalışır. Bu nedenle katkı işlemeden önce görüntüyü incelemek için kullanılabilir. Bu betikle çalışma ağacını test edebilir veya başka şekilde inceleyebilirsiniz. Eğer bir şey eksikse veya testler geçmezse, sıfırsız (non-zero) çıkış yaparak git am betiğini katkı işlemeden durdurabilirsiniz.

post-applypatch bir git am işlemi sırasında çalıştırılan son kancadır , katkı işlendikten sonra çalışır. Bunu, içine çektiğiniz yamayı oluşturan grubu veya yazarı bildirmek için kullanabilirsiniz. Bu betikle yama işlemini durduramazsınız.

Diğer İstemci Kancaları

pre-rebase kancası, herhangi bir şeyi yeniden temellemeden (rebase) önce çalışır ve sıfırsız (non-zero) çıkış yaparak işlemi durdurabilir. Bu kancayı kullanarak zaten itilmiş olan herhangi bir katkının yeniden temellenmesini engelleyebilirsiniz. Git’in kurduğu örnek pre-rebase kancası bunu yapar, ancak iş akışınızla eşleşmeyebilecek bazı varsayımlarda bulunur.

post-rewrite kancası, git commit --amend ve git rebase gibi katkıları değiştiren komutlar tarafından çalıştırılır (ancak git filter-branch tarafından değil). Tek bir argümanı, yeniden yazmayı tetikleyen komutu alır ve stdin üzerinden yeniden yazılara bir liste alır. Bu kancanın post-checkout ve post-merge kancalarıyla aynı kullanımları vardır.

post-checkout kancası başarılı bir git checkout işleminden sonra çalışır; projenizin ortamı için çalışma dizinini uygun şekilde ayarlamak için kullanabilirsiniz. Kaynak kontrol edilmemesini istediğiniz büyük ikilik dosyaları taşımak, otomatik belge oluşturmak veya buna benzer şeyler için kullanılabilir.

post-merge kancası başarılı bir merge komutundan sonra çalışır. Git’in izleyemediği (örneğin izin verileri gibi) çalışma dizinindeki verileri geri yüklemek için kullanabilirsiniz. Bu kancayı, çalışma dizini değiştiğinde içeri alınmasını istediğiniz Git kontrolü dışındaki dosyaların varlığını doğrulamak için de kullanabilirsiniz.

pre-push kancası git push sırasında (uzak referanslar güncellendikten sonra, ancak nesneler aktarılmadan önce) çalışır. Parametreler olarak uzak reponun adı ve konumu ile güncellenecek referansların bir listesini stdin üzerinden alır. Bir itme gerçekleşmeden önce bir referans kümesini doğrulamak için kullanabilirsiniz (bir çıkış kodu sıfır olmayan bir çıkış kodu itme işlemini iptal eder).

Git, normal işleminin bir parçası olarak git gc --auto komutunu çağırarak, zaman zaman artık toplar (garbage collection). pre-auto-gc kancası artık toplama gerçekleşmeden hemen önce çağrılır ve çöp topladığını bildirmek veya şu anda iyi bir zaman olmadığını belirterek toplamayı iptal etmek için kullanılabilir.

Sunucu Tarafı Kancaları

İstemci tarafı kancalarına ek olarak, sistem yöneticisi olarak neredeyse her türlü politikayı uygulamak için bazı önemli sunucu tarafı kancalarını kullanabilirsiniz. Bu betikler sunucuya yapılan itmelerden önce ve sonra çalışır. Ön kancalar, itme işlemini reddetmek ve istemciye bir hata mesajı göndermek için herhangi bir zamanda sıfırsız çıkış yapabilir. Dilediğiniz ölçüde karmaşık bir itme politikası oluşturabilirsiniz.

pre-receive

pre-receive kancası bir istemciden yapılan bir itmeyi işlerken çalıştırılacak ilk betiktir. Bu, stdin’den gönderilen itmelerin bir listesini alır: eğer sıfırsız bir çıkış yaparsa, hiçbiri kabul edilmez. Bu kancayı, güncellenen referansların hiçbirinin hızlı olmayan (non-fast-forward) itmeler olmadığından emin olmak veya itmeyi kullanarak değiştirdiğiniz tüm referanslar ve dosyalara erişim kontrolü yapmak gibi şeyler için kullanabilirsiniz.

update

update betiği, pre-receive betiğiyle çok benzerdir, ancak iten kişinin güncellemeye çalıştığı her dal için bir kez çalıştırılır. Eğer iten kişi birden çok dala itmeye çalışıyorsa, pre-receive yalnızca bir kez çalışırken; update, itilen her dal için bir kez çalışır. Stdin’den okumak yerine, bu betik üç argüman alır: referansın adı (dal), itmeye çalışmadan önce referansın işaret ettiği SHA-1 ve kullanıcının itmeye çalıştığı SHA-1. Eğer güncelleme betiği sıfırsız çıkış yaparsa, yalnızca o referans reddedilir; diğer referanslar hala güncellenebilir.

post-receive

post-receive betiği, işlem tamamlandıktan sonra çalışır ve diğer hizmetleri güncellemek veya kullanıcıları bilgilendirmek için kullanılabilir. Bu betik, pre-receive betiğiyle aynı stdin verilerini alır. Örnekler arasında bir listeye e-posta gönderme, sürekli entegrasyon sunucusunu bildirme veya bir bilet izleme sistemi güncelleme bulunur - hatta katkı mesajlarını analiz ederek açılması, değiştirilmesi veya kapatılması gereken herhangi bir bilet olup olmadığını görebilirsiniz. Bu betik itme işlemini durduramaz, ancak itme tamamlanana kadar istemci bağlantısını kesmez. Bu nedenle uzun sürebilecek herhangi bir işlem yapmaya çalışırken dikkatli olun.

scroll-to-top