Git ön itme kancaları


Yanıtlar:


14

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.


203
Genel olarak katılıyorum, ancak daha sonra ezmek için çok sayıda artımlı taahhütte bulunma alışkanlığınız varsa ve test paketi büyükse, bu pratik olmayabilir.
Cascabel

Anlıyorum. Bu yüzden, testlerin ana dalla birleştirilmeden önce çalıştırılmasını öneririm, ancak ön birleştirme kancası da yok. Bununla birlikte, uzak depodaki bir referansın güncellenmesini önlemek için kullanılabilecek bir "güncelleme" kancası vardır: "Uzak depodaki ref güncellemeden hemen önce, güncelleme kancası çağrılır. Çıkış durumu, ref başarısını veya başarısızlığını belirler. Güncelleştirilecek her başvuru için kanca bir kez çalıştırılır ve üç parametre alır: yenilenen başvurunun adı, başvuruda depolanan eski nesne adı ve başvuruda depolanacak yeni nesne adı. "
ordnungswidrig

18
Olumsuz oy verildi çünkü - bilgilendirici olsa da - OP'nin sorusunu tamamen görmezden geliyor.
The Dembinski

1
@TheDembinski OP sorusunu görmezden geldiğini söylemem. Aslında bunu dikkate alıyor ve bunu yapmanın OP'nin düşündüğünden daha iyi bir yolu olduğunu söylüyor. Genel olarak almak istediğim cevap budur.
calder.ty

9
@ calder.ty - Hayır. manojlds, önemli olanı daha iyi ele alır. Aslında, testleri çalıştıran önceden tamamlama kancaları genellikle kötü bir fikirdir. Kendini işleyen her şeyin testleri geçmesi gerektiğini varsayar. Bu, işbirliğine odaklanan yaygın iş akışları için kötüdür. Yani evet ... Katılmıyorum; ne "bunu" yapmanın daha iyi bir yolu ne de soruyu ele alıyor.
The Dembinski

209

Git sürümde pre-pushkancayı aldı 1.8.2.

Örnek pre-pushkomut 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


1
@manojlds bu kancanın ne için tasarlandığını biliyor musunuz? Belirli bir şubeye gönderirken ikili programımı müşterilerime göndermek için kullanmak istiyorum (yani, itmeden önce gecelik sürümü oluşturun ve curl ile yükleyin). Sorun, derlemenin ve yüklemenin biraz zaman alması ve uzaktan bağlantıyı kapatmasıdır. Bu yüzden ikili programımı oluşturup müşterilere yükledim, ancak bir depoya göndermedim, çünkü uzak repo bağlantıyı kapatır. Bu konuda nasıl çalışılacağına dair bir fikriniz var mı? Ya da belki kökünden kötü bir fikirdir.
igrek

@igrek bağlantı kapatma sorununa bir çözüm buldunuz mu?
Mario Estrada

1
@MarioEstrada, evet, tam olarak nasıl olduğunu hatırlamıyorum, ancak iki kez ittim: önce git komutu birim testlerini çalıştırır ve sonra bağlantı kesilmezse başka bir iş parçacığına iter ve başka bir push başlatır, eğer ilk itme süreleri ise dışarı, başka bir iş parçacığından ikincisi benim için çalışıyor. Birinci ve ikinci başarılı olursa, o zaman ilk itme değişir ve ikincisi hiçbir şeyi itmez. İşin püf noktası, birim testlerini atlayan bazı argümanlar
eklememde

24

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.


14

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.


hiç kanca kullanmamayı mı kastediyorsun? "git pull" yerine, örneğin "git uinttestspull"? bu tam olarak ihtiyacım olan şey değil
koyun yürüyüşü

1
@sheepwalker: s / pull / push / ve onu güzel ve kısa yapmak için bir takma ad kullanın.
Cascabel

@sheepwalker Evet, tam olarak istediğin bu değil, ama @calmh'in dediği gibi, önceden itme kancası yok.
kubi

8

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-receivekancada yapabilirsiniz. Bu, gelen bir baskıyı genellikle reddedeceğiniz yerdir. Ünite testlerini çalıştırmak biraz zor olabilir, ancak bu size kalmış.


6

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-commitancak hangi dalın taahhüt edildiğini kontrol edebilirsiniz. O zaman, diyelim ki, productionbir taahhüdü kabul etmeden önce tüm testlerin geçmesini gerektiren ancak sizin masterumursamadığınız bir şubeye sahip olabilirsiniz . limerick_rake bu senaryoda yararlı olabilir.


teşekkürler, aslında son değişkeni zaten seçtim (Son olarak, testlerinizi ön işleme
kancanızda

1

Cevap son derece yüksek oyu ile bağlı komut gösterir parametreleri vb pre-pushkanca ( $1uzaktan addır $2nasıl kaydedilmesini erişmek ve URL) (çizgiler readstdin'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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.