2009-06-18 5 views

उत्तर

26

इन हुक से एक ऐसा नहीं करेंगे, तो मैं हैरान

http://schacon.github.com/git/githooks.html

हो सकता है कि यह एक होगा:

बाद चेकआउट

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

23

एक Git हुक एक स्क्रिप्ट अपने भंडार का एक विशेष स्थान में रखा है, उस स्थान है:

.git/हुक

स्क्रिप्ट किसी भी तरह का हो सकता है कि आप कर सकते हैं अपने पर्यावरण यानी बैश, पायथन, रूबी इत्यादि में निष्पादित करें

चेकआउट के बाद निष्पादित किया गया हुक post-checkout है। डॉक्स से:

... हुक तीन पैरामीटर ...

दिया जाता है

उदाहरण:

  1. हुक (स्क्रिप्ट) बनाएँ:

    touch .git/hooks/post-checkout 
    chmod u+x .git/hooks/post-checkout 
    
  2. हुक नमूना सामग्री:

#!/bin/bash                  

set -e                   

printf '\npost-checkout hook\n\n'             

prevHEAD=$1                  
newHEAD=$2                  
checkoutType=$3                 

[[ $checkoutType == 1 ]] && checkoutType='branch' ||        
          checkoutType='file' ;         

echo 'Checkout type: '$checkoutType            
echo ' prev HEAD: '`git name-rev --name-only $prevHEAD`      
echo '  new HEAD: '`git name-rev --name-only $newHEAD` 

नोट: पहली पंक्ति में कुटिया स्क्रिप्ट के प्रकार का संकेत।

यह स्क्रिप्ट (गिट हुक) केवल तीन मानकों को पारित करेगी और उन्हें मानव-अनुकूल प्रारूप में मुद्रित करेगी।

+0

क्या आपको यह बताने के किसी भी तरीके से पता है कि यह शाखा निर्माण चेकआउट है (नए हेड के रीफ्लॉग को देखने के अलावा)? – pkoch

+0

ऐसा लगता है कि एक नया सवाल पूछने के लिए यह एक अच्छा विचार होगा। यदि आप करते हैं, तो मुझे लिंक भेजें और मैं देखूंगा कि मैं मदद कर सकता हूं या नहीं। समस्या क्या है जिसे आप हल करने की कोशिश कर रहे हैं? – givanse

+0

यदि कोई प्रतिबद्धता कई शाखाओं का शीर्ष है, तो 'name-rev' केवल वह नाम देता है जो पहले वर्णानुक्रम में आता है। इस प्रकार एक शाखा के साथ एक शाखा की जांच करने के बाद जो मूल शाखा के नाम से पहले वर्णित है, 'पिछली हेड' लाइन नई शाखा का नाम देगी। एक कामकाज: 'यह ब्रंचनाम = $ (गिट रेव-पार्स --ब्रेब-रेफ हेड); $$ में शाखा के लिए (गिट शाखा - रंग = कभी नहीं - $ 1 | sed -e's /^..// '); करें ["$ (गिट शो-रेफ-एस $ शाखा)" == $ 1] && ["$ शाखा"! = "$ यह ब्रंचनाम"]; फिर parentBranchName = $ शाखा; ब्रेक; फाई; किया गया – Ansa211

1

post-checkouthook तीन पैरामीटर प्राप्त करता है:

  1. पिछले HEAD के रेफरी
  2. नए प्रमुख की
  3. रेफरी
  4. क्या यह एक फ़ाइल चेकआउट (0) या शाखा चेकआउट (1)
है

आप इस तथ्य का उपयोग कर सकते हैं कि वर्तमान HEAD से बनाई गई शाखा के पैरामीटर 1 और 2 के लिए समान मान होगा।

cat > .git/hooks/post-checkout <<"EOF" 
if [ "$3" == "0" ]; then exit; fi 
if [ "$1" == "$2" ]; then 
    echo "New branch created. (Probably)." 
fi 
EOF 

chmod u+x .git/hooks/post-checkout 

सीमाएं:

  • एक मौजूदा शाखा है जो एक ही सिर पर होने के लिए वर्तमान प्रधान के रूप में यह मूर्ख होगा होता है की जांच कर रहा।
  • वर्तमान HEAD से नहीं बनाया गया एक नई शाखा बनाना नहीं होगा।
4

दूसरों के समान लेकिन यह सत्यापित करता है कि शाखा को एक बार चेक आउट किया गया है।

#!/bin/bash 

# this is a file checkout – do nothing 
if [ "$3" == "0" ]; then exit; fi 

BRANCH_NAME=$(git symbolic-ref --short -q HEAD) 
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l` 

#if the refs of the previous and new heads are the same 
#AND the number of checkouts equals one, a new branch has been created 
if [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then 
    git push origin ${BRANCH_NAME} 
fi 
+1

यह मुझे सही रास्ते पर मिला, बहुत बहुत धन्यवाद! चूंकि यह चेकआउट की गिनती करने के लिए रीफ्लॉग को गड़बड़ कर रहा है, मेरा मानना ​​है कि यदि एक शाखा पहले मौजूद थी और उसी नाम के साथ एक नई शाखा बनाई गई थी, तो उस शाखा को नए के रूप में पहचाना नहीं जाएगा। यह वांछित व्यवहार या उपयोग के मामले के आधार पर एक मुद्दा हो सकता है लेकिन मुझे लगा कि मैं इसका उल्लेख करूंगा। – Pwnrar

संबंधित मुद्दे