प्री-पुश हुक लगाएं


115

मैं हर गिट पुश से पहले एक यूनिट-परीक्षण चलाना चाहता हूं और यदि परीक्षण विफल हो जाता है, तो पुश को रद्द कर दें, लेकिन मुझे प्री-पुश हुक भी नहीं मिल सकता है, केवल प्री-कमिट और प्री-रिबास है।


जवाबों:


14

मैं परीक्षा पूर्व-हुक में चलाना चाहूंगा। क्योंकि कमिट करते समय परिवर्तन पहले से ही दर्ज है। पहले से रिकॉर्ड किए गए परिवर्तन के बारे में केवल विनिमय जानकारी को पुश और खींचें। यदि एक परीक्षण विफल रहता है तो आपके पास पहले से ही अपने भंडार में "टूटा हुआ" संशोधन होगा। आप इसे आगे बढ़ा रहे हैं या नहीं।


203
मैं आम तौर पर सहमत हूँ, हालांकि अगर आप बाद में स्क्वैश करने के लिए बहुत अधिक वृद्धि करने की आदत में हैं, और परीक्षण सूट बड़ा है, तो यह अव्यावहारिक हो सकता है।
कास्केबेल

समझा। इसलिए मैं मुख्य शाखा के साथ विलय से पहले चलाए जाने वाले परीक्षणों का सुझाव दूंगा लेकिन कोई पूर्व-विलय हुक भी नहीं है। हालाँकि, एक "अपडेट" हुक विच है, जिसका उपयोग दूरस्थ रिपॉजिटरी में एक रेफरी को अपडेट करने से रोकने के लिए किया जा सकता है: "रिमोट रिपॉजिटरी पर रेफरी को अपडेट करने से ठीक पहले, अपडेट हुक को आमंत्रित किया जाता है। इसके निकास की स्थिति रिफ की सफलता या विफलता को निर्धारित करती है। अद्यतन। हुक अद्यतन किए जाने वाले प्रत्येक रेफ के लिए एक बार निष्पादित होता है, और तीन पैरामीटर लेता है: अपडेट किए जाने वाले रेफ का नाम, रेफ में संग्रहीत पुरानी वस्तु का नाम और रेफ में संग्रहित होने वाला नया ऑब्जेक्ट नाम। "
ordnungswidrig

18
डाउन वोट दिया क्योंकि - जानकारीपूर्ण होते हुए - यह ओपी के प्रश्न को पूरी तरह से अनदेखा करता है।
दिम्बिंस्की

1
@ वेंडींस्की मैं यह नहीं कहूंगा कि यह ओपी प्रश्न की उपेक्षा करता है। वास्तव में यह इसे ध्यान में रखता है और कहता है कि ओपी के मन में जिस तरह से था, उससे बेहतर तरीका है। यह सामान्य रूप से उस तरह का उत्तर है जिसे मैं प्राप्त करना चाहता हूं।
calder.ty

9
@ calder.ty - नाह। मनोजों ने बेहतर तरीके से संबोधित किया कि क्या मायने रखता है। वास्तव में, पूर्व-प्रतिबद्ध हुक जो परीक्षण चलाते हैं, आमतौर पर एक बुरा विचार है। यह मानता है कि सभी चीजें जो प्रतिबद्ध हैं वे परीक्षण पास करना चाहिए। जो आम काम प्रवाह के लिए बुरा है जो सहयोग पर ध्यान केंद्रित करता है। तो हाँ ... मैं असहमत हूँ; इसका "इसे" करने का बेहतर तरीका नहीं है और न ही यह प्रश्न को संबोधित करता है।
दिम्बिंस्की

209

रिलीज pre-pushमें गिट को हुक मिला 1.8.2

नमूना pre-pushस्क्रिप्ट: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

नए प्री-पुश हुक के बारे में 1.8.2 रिलीज़ नोट्स: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt


1
@manojisions क्या आप जानते हैं कि इस हुक को किसके लिए इस्तेमाल करने के लिए डिज़ाइन किया गया है? मैं अपने बाइनरी को अपने ग्राहकों को धकेलने के लिए इसका उपयोग करना चाहूंगा जब एक विशिष्ट शाखा पर धकेल दिया जाएगा (यानी रात के संस्करण का निर्माण करें और धक्का देने से पहले इसे कर्ल के साथ अपलोड करें)। समस्या यह है कि निर्माण और अपलोड करने में कुछ समय लगता है, और रिमोट कनेक्शन बंद हो जाता है। इसलिए मैं अपने बाइनरी के साथ निर्मित और ग्राहकों को अपलोड करता हूं, लेकिन एक रेपो में नहीं धकेल दिया जाता है, क्योंकि रिमोट रेपो कनेक्शन को बंद कर देता है। किसी भी विचार कैसे इस के आसपास काम करने के लिए? या हो सकता है कि यह जड़ में एक बुरा विचार है।
इग्रेक

@igrek क्या आपको कनेक्शन बंद करने के मुद्दे का हल मिला?
मारियो एस्ट्राडा

1
@MarioEstrada, हाँ, मुझे ठीक से याद नहीं है कि कैसे, लेकिन मैंने इसे दो बार धक्का दिया: पहला git कमांड यूनिट टेस्ट चलाता है और फिर अगर यह डिस्कनेक्ट नहीं करता है तो यह पुश करता है और दूसरे धागे में दूसरा पुश शुरू होता है, अगर पहला पुश बार बाहर, दूसरे धागे से दूसरा मेरे लिए काम करता है। यदि पहला और दूसरा सफल होता है, तो पहला धक्का बदल जाता है, और दूसरा कुछ भी नहीं धकेलता है। चाल यह है कि मैंने कुछ तर्क जोड़े थे, जो इकाई परीक्षणों को
दरकिनार कर

24

Git को 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

जैसा कि आप देख सकते हैं कि उदाहरण एक संरक्षित शाखा का उपयोग करता है, पूर्व-पुश हुक के अधीन।


14

यदि आप कमांड लाइन का उपयोग कर रहे हैं, तो ऐसा करने का सबसे आसान तरीका एक पुश स्क्रिप्ट लिखना है जो आपकी इकाई परीक्षण चलाता है और यदि वे सफल होते हैं, तो पुश पूरा करता है।

संपादित करें

1.8.2 git के रूप में यह उत्तर पुराना है। ऊपर देखें मनोजर्सन का जवाब।


क्या आप हुक का उपयोग नहीं करते हैं? उदाहरण के लिए, "गिट पुल" को "git uinttestspull" से बदल दें? कि 'मैं वास्तव में क्या जरूरत नहीं रहा है
sheepwalker

1
@ शेपवल्कर: एस / पुल / पुश /, और इसे अच्छा और छोटा बनाने के लिए एक उपनाम का उपयोग करें।
Cascabel

@sheepwalker हाँ, यह बिल्कुल वैसा नहीं है जैसा आपने पूछा था, बल्कि @calmh ने कहा, कोई प्री-पुश हुक नहीं है।
कुवि

8

इसके लिए एक हुक नहीं है, क्योंकि एक धक्का एक ऑपरेशन नहीं है जो आपके भंडार को संशोधित करता है।

आप प्राप्त करने के पक्ष में चेक कर सकते हैं, हालांकि, post-receiveहुक में। यह वह जगह है जहाँ आप आमतौर पर एक आने वाले धक्का को अस्वीकार कर देंगे। रनिंग यूनिट टेस्ट एक हुक में करने के लिए थोड़ा गहन हो सकता है, लेकिन यह आपके ऊपर है।


6

रिकॉर्ड के लिए, Git 1.6 में एक पैच होता है जो प्री-पुश हुक जोड़ता है । मुझे नहीं पता कि यह 1.7 के खिलाफ काम करता है या नहीं।

इसके साथ गड़बड़ करने के बजाय, आप पुश स्क्रिप्ट को चला सकते हैं जैसे @kubi अनुशंसित हैं। आप इसके बदले इसे एक रेक कार्य भी बना सकते हैं ताकि यह आपके रेपो में हो। माणिक-गिट इसकी मदद कर सकते थे। यदि आप लक्ष्य रेपो की जांच करते हैं, तो आप उत्पादन रेपो को आगे बढ़ाते हुए ही परीक्षण चला सकते हैं।

अंत में, आप अपने परीक्षण को अपने pre-commitहुक में चला सकते हैं, लेकिन जांच करें कि किस शाखा के लिए प्रतिबद्ध है। तब आप एक कह सकते हैं, एक productionशाखा , जिसे एक परीक्षण स्वीकार करने से पहले सभी परीक्षणों की आवश्यकता होती है , लेकिन आपकी masterपरवाह नहीं करता है। limerick_rake उस परिदृश्य में उपयोगी हो सकता है।


धन्यवाद, वास्तव में मैंने पहले से ही अंतिम संस्करण को चुना है (अंत में, आप अपने परीक्षण को अपने पूर्व-प्रतिबद्ध हुक में चला सकते हैं ..)
शीपवॉल्कर

1

स्क्रिप्ट उच्च मतदान जवाब से जुड़े मानकों आदि शो के लिए pre-pushहुक ( $1दूरदराज के नाम, है $2और कैसे करता पहुँचने के लिए URL) (लाइनों readstdin से संरचना है <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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.