ฉันต้องการเรียกใช้การทดสอบหน่วยก่อนการพุชคอมไพล์ทุกครั้งและหากการทดสอบล้มเหลวให้ยกเลิกการพุช แต่ฉันไม่พบตะขอพรีพุชมีเฉพาะ pre-commit และ pre-rebase เท่านั้น
ฉันต้องการเรียกใช้การทดสอบหน่วยก่อนการพุชคอมไพล์ทุกครั้งและหากการทดสอบล้มเหลวให้ยกเลิกการพุช แต่ฉันไม่พบตะขอพรีพุชมีเฉพาะ pre-commit และ pre-rebase เท่านั้น
คำตอบ:
ฉันอยากจะทำการทดสอบแบบ pre-commit-hook เนื่องจากมีการบันทึกการเปลี่ยนแปลงไว้แล้วเมื่อกระทำ ผลักและดึงเฉพาะแลกเปลี่ยนข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่บันทึกไว้แล้ว หากการทดสอบล้มเหลวคุณจะมีการแก้ไข "เสีย" ในที่เก็บของคุณอยู่แล้ว ไม่ว่าคุณจะผลักดันหรือไม่ก็ตาม
Git มี pre-push
เบ็ดในการ1.8.2
เปิดตัว
ตัวอย่างpre-push
สคริปต์: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
บันทึกประจำรุ่น 1.8.2 พูดถึง pre-push hook ใหม่: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Git ได้รับ pre-push hook ในรุ่น 1.8.2
ตะขอกดล่วงหน้าคือสิ่งที่ฉันต้องการพร้อมกับตะขอเกี่ยวล่วงหน้า นอกเหนือจากการปกป้องสาขาแล้วยังสามารถให้การรักษาความปลอดภัยเพิ่มเติมร่วมกับตะขอแบบพรีคอมมิต
และสำหรับตัวอย่างวิธีการใช้งาน (นำมาใช้และปรับปรุงจากรายการที่ดีนี้ )
ตัวอย่างง่ายๆในการล็อกอินเข้าสู่คนเร่ร่อนเรียกใช้การทดสอบแล้วกด
#!/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
ดังที่คุณเห็นตัวอย่างใช้สาขาที่ได้รับการป้องกันซึ่งเป็นเรื่องของพรีพุชเบ็ด
หากคุณกำลังใช้บรรทัดคำสั่งวิธีที่ง่ายที่สุดในการดำเนินการนี้คือการเขียนสคริปต์พุชที่รันการทดสอบหน่วยของคุณและหากทำได้สำเร็จให้ทำการพุช
แก้ไข
จาก git 1.8.2 คำตอบนี้ล้าสมัย ดูคำตอบของ manojlds ด้านบน
ไม่มีตะขอสำหรับมันเนื่องจากการพุชไม่ใช่การดำเนินการที่ปรับเปลี่ยนที่เก็บของคุณ
คุณสามารถทำการตรวจสอบในฝั่งรับได้ในpost-receive
ตะขอ นั่นคือจุดที่คุณมักจะปฏิเสธการผลักดันที่เข้ามา การเรียกใช้การทดสอบหน่วยอาจต้องทำแบบเบ็ดเสร็จเล็กน้อย แต่ก็ขึ้นอยู่กับคุณ
สำหรับบันทึกที่มีแพทช์เพื่อ Git 1.6 ที่เพิ่มเบ็ดก่อนผลักดัน ฉันไม่รู้ว่ามันใช้ได้กับ 1.7 ไหม
แทนที่จะยุ่งกับสิ่งนั้นคุณสามารถเรียกใช้ push script เช่น @kubi แนะนำ คุณยังสามารถทำให้เป็นงาน Rake แทนดังนั้นจึงอยู่ใน repo ของคุณ Ruby-gitสามารถช่วยในเรื่องนี้ได้ หากคุณตรวจสอบ repo เป้าหมายคุณจะเรียกใช้การทดสอบได้ก็ต่อเมื่อกดไปที่ repo การผลิตเท่านั้น
สุดท้ายคุณสามารถเรียกใช้การทดสอบของคุณในpre-commit
เบ็ดของคุณแต่ตรวจสอบว่าสาขาใดที่มุ่งมั่น จากนั้นคุณอาจมีproduction
สาขาที่ต้องผ่านการทดสอบทั้งหมดก่อนที่จะยอมรับข้อตกลง แต่คุณmaster
ไม่สนใจ limerick_rakeอาจมีประโยชน์ในสถานการณ์นั้น
สคริปต์เชื่อมโยงโดยสูงได้รับการโหวตคำตอบที่แสดงให้เห็นว่าพารามิเตอร์ ฯลฯ กับpre-push
ตะขอ ( $1
เป็นชื่อที่ห่างไกล$2
URL) และวิธีการเข้าถึงกระทำ (เส้นread
จาก stdin มีโครงสร้าง<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