Git kancalarını uygulama

Tamamlandı

Geliştirme sürecinde kod kalitesine öncelik verilmesi, yerel kod geliştirme ile başlamalıdır. Olası kod kalitesi sorunlarını algılamak ve düzeltmek için çekme isteklerine başlamadan önce bile bu uygulamaya yönelik fırsatları belirlemek önemlidir.

Git kancaları harika bir fırsat sunar. Git yaşam döngüsü içindeki işlemeler, birleştirmeler ve göndermeler gibi önemli olaylara yanıt olarak özel betikleri yürütmek için bir mekanizma görevi görür. Deponun .git\hooks dizininde yer alan betikler, yazılım geliştirme görevlerini otomatikleştirme ve geliştirme standartlarını zorlama konusunda neredeyse sınırsız esneklik sağlar.

Git kancalarını uygulama

İstemci tarafı Git kancalarını keşfederek başlayalım. .git\hooks deposu dizinine gidin; uzantısına samplesahip birçok dosya bulabilirsiniz. Bu uzantı yalnızca amacını değil, çalışmasını da etkili bir şekilde engeller. Dosya adları, uzantıyı kaldırdığınızda sample yürütmelerini tetikleyen Git eylemlerini tanımlar.

Otomasyon için Git kanca dosyalarının ekran görüntüsü.

Ön işleme dosyasını ön işleme sample olarak yeniden adlandırın. Dosyanın adından da belirtildiği gibi, git işleme eylemini her çağırdığınızda içerdiği betik çalıştırılır. İşleme, yalnızca ön işleme betiğinizin 0 dönüş değeriyle çıkması durumunda izler.

Ancak, bunun varsayılan olarak windows işletim sistemlerinde istendiği gibi çalışmayacağını unutmayın. Bu davranışın yaygın olarak göz ardı edilen nedeni, betiğin ilk satırıdır:

#!/bin/sh

Linux işletim sistemlerinde #! ön ek, program yükleyicisine dosyanın geri kalanının yorumlanacak bir betik içerdiğini ve /bin/sh dosyasının kullanılması gereken yorumlayıcının tam yolu olduğunu gösterir.

Windows için Git Bash komutlarını ve kabuk betiklerini desteklese de, dosya sistemi yollarını tasarlarken aynı kuralı izlemez. Bunun yerine, sürücü harfinden başlayarak sh.exe dosyasının tam yolunu sağlamanız gerekir.

Ancak, Windows için Git'in varsayılan olarak C:\Program Files dizinine yüklenmesinden kaynaklanan ek bir uyarı vardır. Bu dizin adında bir boşluk içerdiğinden, sh.exe dosyasının sonuçta elde edilen yolu iki ayrı yol olarak yorumlanır ve hataya neden olur. Bunu önlemek için, kaçış karakteri olarak görev yapmak için boşluğun önüne tek bir ters eğik çizgi (\) eklemek gerekir. Etkili bir şekilde, Windows için Git'in 64 bit sürümünü kullanırken betiğin ilk satırının aşağıdaki biçime sahip olması gerekir:

#!C:/Program\ Files/Git/usr/bin/sh.exe

Nasıl yapılır

Git ön işleme betiklerinin yeni bulunan işlevselliğini nasıl kullanabilirsiniz? Gizli dizileri yanlışlıkla GitHub'a sızdırmanızı engellemeye ne dersin?

Git kancasını kullanarak yerel deponuza işlenen kodu belirli anahtar sözcükler için tarayalım. Ön işleme kabuğu dosyasının içeriğini aşağıdaki kodla değiştirin:

#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
  cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi

Bu örnek, tam teşekküllü bir çözüm yerine kavramı göstermek içindir, bu nedenle anahtar sözcük listesi kasıtlı olarak önemsizdir. Normal ifadeleri kullanarak kapsamı ve esnekliği önemli ölçüde genişletebilirsiniz. Ayrıca, devam eden bakımı önemli ölçüde basitleştirecek bir dış dosyaya başvurma seçeneğiniz de vardır.

Nasıl Çalışır?

İşleme öncesi kanca betiği çağrıldıktan sonra git diff ve grep komutlarını kullanarak işlenen koddaki artımlı değişiklikler içindeki anahtar sözcükleri veya desenleri tanımlar. Herhangi bir eşleşme algılanırsa, betik bir hata iletisi oluşturur ve işlemenin gerçekleştirilmesini engeller.

Daha Fazlası:

İşleme öncesi kanca betiklerinin diğer yaygın kullanım örnekleri arasında kod biçimlendirme, lint veya işlemenin proje standartlarına uygun olduğundan emin olmak için özel testler çalıştırma yer alır. Prepare-commit-msg, işleme iletisi düzenleyicisi başlatılmadan önce çalışır. Belirlenen ön eklerin kullanımı gibi adlandırma kurallarını zorunlu kılmak için işleme iletilerinin dinamik olarak oluşturulmasını sağlar (örneğin, başarı: özellikler veya düzeltme için: hata düzeltmeleri için).

Örneğin, aşağıdaki prepare-commit-msg betiği, yeni bir işleme oluştururken geçerli dal adını otomatik olarak işleme iletisine ekler. Dal adını ve ardından dosyanın başına iki nokta üst üste ve boşluk ekleyerek işleme iletisi dosyasını ($1) değiştirir.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
  # Prepend the branch name to the commit message
  sed -i "1s/^/$branch_name: /" "$1"
fi

İşleme sonrası betikleri bir işleme tamamlandıktan sonra yürütülür. Bildirimleri tetikleme veya belge oluşturma amacıyla kullanılabilir.

Örneğin, aşağıdaki betik her işlemeden sonra belirlenen alıcıya bir e-posta bildirimi gönderir. Betik, alıcı e-posta adresi, SMTP sunucusu ve e-postanın konusu ve gövdesi değiştirilerek özelleştirilebilir. Ayrıca, sisteminizi Send-MailMessage PowerShell cmdlet'ini kullanarak e-posta gönderecek şekilde yapılandırmanız veya ortamınıza ve gereksinimlerinize bağlı olarak bildirim göndermek için farklı bir yöntem kullanmanız gerekebilir.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"

Depo .git\hooks klasörünün kaynak denetimine işlenmediğini belirtmek gerekir. Geliştirdiğiniz betikleri geliştirme ekibinizin diğer üyeleriyle paylaşmanın bir yolu olup olmadığını merak ediyor olabilirsiniz. İyi haber, Git sürüm 2.9'dan başlayarak Git kancalarını kaynak denetimine işlenebilen bir klasöre eşleyebilirsiniz. Bunu yapmak için Git deponuzun genel ayarlar yapılandırmasını güncelleştirebilirsiniz:

Git config --global core.hooksPath '~/.githooks'

İstemci tarafında ayarladığınız Git kancalarının üzerine yazmanız gerekirse doğrulama yok anahtarını kullanarak bunu yapabilirsiniz:

Git commit --no-verify

Sunucu Tarafı Kancaları

İstemci tarafı Git kancaları geliştirme iş akışını geliştirmeye yönelik güçlü özellikler sunsa da Azure Repos, çekme istekleri oluşturma desteği de dahil olmak üzere geliştirme sürecini daha da artırmak için sunucu tarafı kancalar da sağlar. Daha fazla bilgi için bkz. Azure Repos Hizmeti kanca olayları başvurusu.