Git Kancaları

Yayınlanan: 2022-07-02

Git, son birkaç yazımızda yüzeyini zar zor çizdiğimiz güçlü bir sürüm kontrol sistemidir. Bugün Git'in size Git Hooks ile sağlayabileceği otomasyon gücüne bakacağız.

git init komutunu kullandığınızda her depoda yerleşik kancalar bulunur. Bir depo başlatıldığında, gizli bir .git dizini alırsınız ve bunun içinde, tüm kancalarınızı içerecek olan ve kancalar adlı bir dizin bulunur. Elinizde olan herhangi bir git deposunu açın ve gizli dizini görmek için ls -a kullanın, ardından favori kod düzenleyicinizde açın.

Başlamak için .sample dosya uzantılarına sahip bir grup dosya göreceksiniz. Tam olarak söyledikleri bunlar, projelerinizde kullanabileceğiniz örnek betikler. Dosyalar, üzerinde çalıştıkları kancaya karşılık gelecek şekilde adlandırılır. Böylece post-commit.sample , post-commit kancasında çalışır.

Bir kanca yazmak için hemen hemen her dili kullanabilirsiniz. Dosya, dosyanın üstündeki Shebang gösterimine göre ayrıştırılır. Düğüm kullanmak isteseydin #! /usr/bindi/env node #! /usr/bindi/env node ve dosyanız bir düğüm dosyası olarak ayrıştırılacaktır.

Git kancalarıyla neler yapabileceğinize geçmeden önce, kullanabileceğiniz bazı kancalara bir göz atalım.

Git Kanca Türleri

İş Akışı Kancalarını Taahhüt Et

pre-commit , siz taahhüt mesajınızı bile girmeden önce çalıştırılır ve git commit --no-verify ile atlanabilir.

prepare-commit-msg , taahhüt mesajınızda gördüğünüz varsayılan mesajı düzenlemek için kullanılabilir. Geliştiricilere ne tür bir taahhüt mesajı bırakmaları gerektiği konusunda talimat vermek için kullanın. Ayrıca, birleştirmeler gibi mesajın sizin için otomatik olarak oluşturulduğu yerlerin içeriğini otomatikleştirmek veya taahhüt mesajınıza otomatik olarak bir sayı numarası eklemek için de kullanılabilir.

commit-msg , projeniz için taahhüt mesajını doğrulamak için kullanılabilir. Belki de kimsenin sadece “boşlukla uğraşmak” diyen bir taahhüt mesajı koyabilmesini istemiyorsunuzdur. Beyaz boşluk kelimelerinin varlığını tespit etmek için bu kancayı kullanabilir ve ardından kullanıcıya daha iyi bir taahhüt mesajı almaları gerektiğine dair bir uyarı verebilir ve kullanıcıya bir uyarı sağlayabilirsiniz.

post-commit sonrası, yukarıdaki tüm taahhüt kancalarından sonra çalışır. Bir taahhüdün yapıldığına dair bir bildirim için en kullanışlıdır.

Müşteri Kancaları

başarılı bir git checkout komutu çalıştırdıktan sonra post-checkout çalışır. Sitede kullanılan bir dizi büyük dosyanız varsa ancak bunların kaynak kontrolünde olmasını istemiyorsanız, dosyaları sizin için taşımak için bu komutu kullanabilirsiniz.

herhangi bir nesne uzak havuza aktarılmadan önce bir git push komutu sırasında pre-push çalışır.

Sunucu Kancaları

pre-receive , bir istemci kodu uzak bir havuza ittiğinde çalışır. Bu, gönderimi kabul etmeden önce projenizin kriterlerini karşıladığından emin olmak için gönderilen kodu kontrol etmek için kullanılabilir.

uzak deponuz güncellemeleri aldıktan sonra post-receive çalışır. Bu, bir dağıtım sürecini tetikleyen bir web kancasını çağırmak veya bir taahhüdün alındığını ve incelemeye hazır olduğunu bir sohbet odasına bildirmek için kullanılabilir.

Yukarıdaki kancaların çoğu yalnızca belirli dallarda çalışacak şekilde ayarlanabilir. Bu, yalnızca biri dağıtıma hazır olması gereken ana şubeye kod gönderdiğinde bir post-receive kanca kullandığınızda anlamına gelebilir. Kodu gözden geçirmesi ve ardından dağıtması için bir geliştirici listesi bildirilebilir. Bu şekilde, bir dağıtımda her zaman 2 çift göze sahip olursunuz; bu, tek bir geliştiricinin kolayca gözden kaçırabileceği hataları yakalamak anlamına gelebilir.

Kullanılabilir kancalardan bazılarını atladım çünkü onları kullanmaya hiç ihtiyaç duymadım. Bahsetmediğim bir dizi kanca, e-posta iş akışı kancalarıdır. E-posta yoluyla kodunuz için yama kabul etmiyorsanız, muhtemelen bunlara asla ihtiyacınız olmayacak. Mevcut tüm kancaları belgelerde bulabilirsiniz.

Pratikte en çok kullandığım kancalar:

  • ön taahhüt
  • ön itme
  • taahhüt-msg
  • ön alım
  • post-taahhüt
  • alma sonrası

Şimdi bu kancalarla bir şeyler yapalım.

WP Cli ve Git Hooks ile bir WordPress Eklentisini Etkinleştirme

Bu yıl bir müşteri projesi için bir mağaza ekliyordum ve hala ana sitede birkaç görev yapıyordum. Bu, ana sitede herhangi bir WooCommerce eklentimizin kurulu olmadığı veya etkinleştirilmediği anlamına geliyordu. WooCommerce mağazasını bir şubede geliştirmem gerekiyordu ve yalnızca hepsini canlı yayınlamaya hazır olduğumda, WooCommerce'i ana bölüme taşımak istedim.

Başlamak için mağaza adında yeni bir şubeye ihtiyacımız olacak. Bunu git checkout -b store kullanarak alabiliriz. Bu yeni bir şube oluşturur ve bizim için kontrol eder. Şimdi kancayı hazırlayalım.

İlk önce bu komutla .git/hooks/post-checkout öğesine dokunun.

Daha sonra çalıştırılabilir hale getirmemiz gerekiyor. Bunu chmod +x .git/hooks/post-checkout terminalindeki chmod komutuyla yapabiliriz.

Şimdi dosyayı seçtiğiniz kod düzenleyicinizde açın ve aşağıdaki kodu post-checkout dosyanıza kopyalayın.

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

Terminal aracılığıyla herhangi bir şubeye geçerek bunu demo yapabilirsiniz. WooCommerce ve AutomateWoo'nun etkinleştirildiğini söyleyen iki satır görmelisiniz. Çalıştığını biliyoruz, ancak istediğimiz gibi değil çünkü herhangi bir şubeye her geçişimizde eklentileri açacak.

Gerçekten istediğimiz, mağaza şubemize taşındığımızda onları açmak ve daha sonra ana şubemizdeyken kapatmak. Bunu yapmak için hangi dal olduğumuzu tespit etmek için kancaya ihtiyacımız olacak. post-checkout içeriğini aşağıdaki kodla değiştirin.

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

Bu kod, kontrol ettiğimiz dalı branch_name değişkenine atayarak başlar. O zaman iki if ifademiz var. Mağaza şubesine taşınıp taşınmadığımızı görmek için ilk kontroller. Varsa, WooCommerce ve AutomateWoo'yu etkinleştirmek için WP CLI kullanır.

Sonraki if ifadesi ana dalda olup olmadığımızı kontrol eder. Eğer öyleysek, eklentileri WP CLI ile devre dışı bırakacak ve bize terminalde anlatacak.

Git Kancaları ile Git İş Akışlarını Kontrol Etme

Git ile ilgili önceki bir gönderide farklı Git iş akışlarından bahsetmiştim. Kancalar için çok yaygın bir kullanım durumu, herhangi birinin doğrudan ana şubeye kod işlemesini engellemektir. Tüm kodun farklı bir daldan ana ile birleştirildiğinden emin olmak için bir kanca kullanabilirsiniz.

pre-commit.sample adını pre- pre-commit olarak yeniden adlandırarak başlayın ve ardından yukarıda açıkladığım gibi yürütülebilir hale getirin. Ardından aşağıdaki kodu alın ve ön taahhüt dosyasında kullanın.

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

Bu, ana dalda olup olmadığımızı kontrol eder ve eğer öyleyse, taahhüt durdurulur. Ardından, kullanıcıya doğrudan ana şubeye taahhütte bulunmamaları gerektiğine dair bir hatırlatıcı yazdırır.

Birçok yerin şubeleri olarak main dönüştüğünü unutmayın. Daha eski projeler, güncellenmemişlerse burada master ihtiyaç duyabilirler.

Hatta bunu bir adım daha ileri götürebilir ve bir sohbet uygulamasının API'sine erişmek için cURL'yi kullanabilir ve ardından birinin ana uygulamayı taahhüt etmeye çalıştığı konusunda herkese açık olarak şikayet edebilirsiniz.

Git kancalarının tek sınırlaması hayal gücünüzdür. Kodlarında YAPILACAKLAR varsa veya bir dosyanın sonundaki boşlukları durdurmak için birinin taahhütte bulunmasını durdurmak için bunları kullanabilirsiniz.

İş akışınızın bir parçası sürekli bir engel oluşturuyorsa, otomatikleştirmek için kancalara bakın, böylece hatırlamak zorunda kalmazsınız.