Git kancalarını uygulama
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ünde işlem, birleştirme ve gönderme gibi önemli olaylar karşısında özel komut dosyalarını çalıştırmak için bir mekanizma olarak görev yaparlar. 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
Müşteri taraflı Git kancalarını keşfederek başlayalım. .git\hooks deposu dizinine gidin; uzantısı sample
olan birçok dosya bulabilirsiniz. Bu uzantı yalnızca amaçlarını göstermeyi değil, onları çalışmaktan da etkili bir şekilde alıkoyar. Dosya adları, sample
uzantısını kaldırdığınızda yürütmelerini tetikleyen Git eylemlerini tanımlar.
Ön işleme sample
dosyasını ön işleme 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 gerçekleştirilir.
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 hatayla sonuçlanır. 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? GitHub'a yanlışlıkla gizli bilgiler sızdırmanızın önüne geçmeye ne dersiniz?
Git kancasını kullanarak yerel deponuza işlenen kodu belirli anahtar sözcükler için tarayalım. Pre-commit kabuk 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, kod kontrolü 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. Adlandırma kurallarını zorunlu kılmak için, belirli ön eklerin kullanımı gibi, commit mesajlarının dinamik olarak oluşturulmasını sağlar (örneğin, özellikler için feat: veya hata düzeltmeleri için fix:).
Ö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. Dosyanın başına dal adı, ardından iki nokta ve boşluk ekleyerek işleme mesajı 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
İşlem sonrası komut dosyaları, bir commit tamamlandıktan sonra çalıştırı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 kontrole dahil edilmediğ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
Server-Side 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 Hizmet kancaları olayları referansı.