Her git itmeden önce bir birim testi çalıştırmak istiyorum ve testler başarısız olursa, itmeyi iptal edin, ancak ön-itme kancasını bile bulamıyorum, sadece ön taahhüt ve yeniden ödeme var.
Her git itmeden önce bir birim testi çalıştırmak istiyorum ve testler başarısız olursa, itmeyi iptal edin, ancak ön-itme kancasını bile bulamıyorum, sadece ön taahhüt ve yeniden ödeme var.
Yanıtlar:
Testi bir ön işleme kancasında çalıştırmayı tercih ederim. Çünkü taahhüt sırasında değişiklik zaten kaydedilmiştir. İtme ve çekme, yalnızca önceden kaydedilmiş olan değiştirilmiş bilgi alışverişi. Bir test başarısız olursa, deponuzda zaten "bozuk" bir revizyon olur. İtiyor olsanız da olmasanız da.
Git sürümde pre-push
kancayı aldı 1.8.2
.
Örnek pre-push
komut dosyası: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
Yeni itme öncesi kancasından bahseden 1.8.2 sürüm notları: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Git, 1.8.2 sürümünde ön itme kancasını aldı.
Ön işleme kancaları ile birlikte ihtiyacım olan şey ön itmeli kancalar. Bir şubeyi korumanın yanı sıra, ön taahhüt kancalarıyla birlikte ekstra güvenlik de sağlayabilirler.
Ve nasıl kullanılacağına dair bir örnek için ( bu güzel girişten alınmış ve benimsenmiş ve geliştirilmiş )
Serseriye giriş yapmak, testleri çalıştırmak ve ardından itmek için basit bir örnek
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
Gördüğünüz gibi, örnekte ön itme kancasının konusu olan korumalı bir dal kullanılmaktadır.
Komut satırını kullanıyorsanız, bunu yapmanın en kolay yolu, birim testlerinizi çalıştıran ve başarılı olursa, itmeyi tamamlayan bir push komut dosyası yazmaktır.
Düzenle
Git 1.8.2 itibariyle bu cevap güncelliğini yitirmiştir. Manojlds'nin yukarıdaki cevabına bakın.
Bunun için bir kanca yoktur, çünkü bir itme, deponuzu değiştiren bir işlem değildir.
Kontrolleri alıcı tarafta yine de post-receive
kancada yapabilirsiniz. Bu, gelen bir baskıyı genellikle reddedeceğiniz yerdir. Ünite testlerini çalıştırmak biraz zor olabilir, ancak bu size kalmış.
Kayıt için, bir ön itme kancası ekleyen Git 1.6'ya bir yama var . 1.7'ye karşı çalışıp çalışmadığını bilmiyorum.
Bununla uğraşmak yerine, @kubi'nin önerdiği gibi bir push komut dosyası çalıştırabilirsiniz. Bunun yerine bir Rake görevi de yapabilirsiniz, böylece deponuzda olur. ruby-git bu konuda yardımcı olabilir. Hedef depoyu kontrol ederseniz, testleri yalnızca üretim deposuna gönderirken çalıştırabilirsiniz.
Son olarak, testlerinizi kancanızda çalıştırabilir, pre-commit
ancak hangi dalın taahhüt edildiğini kontrol edebilirsiniz. O zaman, diyelim ki, production
bir taahhüdü kabul etmeden önce tüm testlerin geçmesini gerektiren ancak sizin master
umursamadığınız bir şubeye sahip olabilirsiniz . limerick_rake bu senaryoda yararlı olabilir.
Cevap son derece yüksek oyu ile bağlı komut gösterir parametreleri vb pre-push
kanca ( $1
uzaktan addır $2
nasıl kaydedilmesini erişmek ve URL) (çizgiler read
stdin'den yapıya sahip <local ref> <local sha1> <remote ref> <remote sha1>
)
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_sha" = $z40 ]
then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=`git rev-list -n 1 --grep '^WIP' "$range"`
if [ -n "$commit" ]
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0