Saya ingin menjalankan unit-test sebelum setiap git push dan jika tes gagal, batalkan push, tetapi saya bahkan tidak dapat menemukan hook pre-push, hanya ada pre-commit dan pre-rebase.
Saya ingin menjalankan unit-test sebelum setiap git push dan jika tes gagal, batalkan push, tetapi saya bahkan tidak dapat menemukan hook pre-push, hanya ada pre-commit dan pre-rebase.
Jawaban:
Saya lebih suka menjalankan tes dalam hook pra-komitmen. Karena perubahan sudah dicatat saat melakukan. Dorong dan tarik hanya bertukar informasi tentang yang sudah direkam berubah. Jika sebuah tes gagal, Anda akan memiliki revisi yang "rusak" di repositori Anda. Apakah Anda sedang mendorongnya atau tidak.
Git mendapat pre-push
kait di 1.8.2
rilis.
Contoh pre-push
skrip: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
1.8.2 catatan rilis berbicara tentang pra-push hook baru: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Git mendapatkan hook pra-dorong di rilis 1.8.2.
Kait pra-dorong adalah apa yang saya butuhkan bersama dengan kait pra-komit. Selain melindungi cabang, mereka juga dapat memberikan keamanan ekstra yang dikombinasikan dengan kait pra-komit.
Dan untuk contoh tentang cara menggunakan (diambil dan diadopsi dan ditingkatkan dari entri yang bagus ini )
Contoh sederhana untuk login ke gelandangan, menjalankan tes dan kemudian push
#!/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
Seperti yang Anda lihat, contoh menggunakan cabang yang dilindungi, subjek kait pra-dorong.
Jika Anda menggunakan baris perintah, cara termudah untuk melakukannya adalah dengan menulis skrip push yang menjalankan pengujian unit Anda dan, jika berhasil, menyelesaikan dorongan.
Sunting
Mulai git 1.8.2, jawaban ini sudah usang. Lihat jawaban manojlds di atas.
Tidak ada hook untuk itu, karena push bukanlah operasi yang mengubah repositori Anda.
Anda dapat melakukan pemeriksaan di sisi penerima, di post-receive
hook. Di situlah biasanya Anda akan menolak dorongan masuk. Menjalankan pengujian unit mungkin sedikit intensif untuk dilakukan, tetapi itu terserah Anda.
Sebagai catatan, ada patch ke Git 1.6 yang menambahkan hook pra-dorong . Saya tidak tahu apakah ini berfungsi terhadap 1.7.
Daripada mengacaukannya, Anda dapat menjalankan skrip push seperti yang direkomendasikan @kubi. Anda juga bisa menjadikannya sebagai tugas Rake sehingga ada di repo Anda. ruby-git bisa membantu dengan ini. Jika Anda memeriksa repo target, Anda dapat menjalankan pengujian hanya saat mendorong ke repo produksi.
Terakhir, Anda dapat menjalankan pengujian Anda di pre-commit
hook tetapi memeriksa cabang apa yang sedang dikomit. Kemudian Anda dapat memiliki, katakanlah, production
cabang yang mengharuskan semua tes lulus sebelum menerima komit tetapi Anda master
tidak peduli. limerick_rake mungkin berguna dalam skenario itu.
The Script dihubungkan oleh yang sangat-sebagai jawabannya menunjukkan parameter dll untuk pre-push
kait ( $1
nama terpencil, $2
URL) dan cara mengakses komit (garis read
dari stdin memiliki struktur <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