2011-09-08 15 views
87

से निपटने के लिए एक गिट पोस्ट-प्राप्त हुक लिखना यहां एक नंगे रेपो में मेरा वर्तमान हुक है जो कंपनी के सर्वर में रहता है: git push origin master यह हुक असेंबला को धक्का देता है। मुझे केवल एक शाखा (मास्टर, आदर्श) को धक्का देना है जब कोई हमारे सर्वर पर उस शाखा में परिवर्तन को धक्का देता है, और अन्य शाखाओं को धक्का देता है। क्या एक नंगे रेपो से शाखा का चयन करना संभव है और केवल उस शाखा को असेंबला में धक्का देना संभव है?एक विशिष्ट शाखा

+0

आपका क्या मतलब है? 'गिट पुश मूल मास्टर' केवल 'मास्टर' शाखा को 'मूल' रिमोट पर धक्का देगी, जिसे मैं मानता हूं जिसे असेंबला माना जाता है। क्या आप कह रहे हैं कि आपको केवल 'हुक * ट्रिगर करने की आवश्यकता है जब कोई' मास्टर 'पर जाता है,' सुविधा 1 'के विपरीत, या ऐसा कुछ? –

+0

@ स्टीफन बिल्कुल यही है। मुझे शब्द नहीं मिला, हे। –

+0

डुप्लिकेट http://stackoverflow.com/questions/6372334/git-commit-hooks-per-branch – insign

उत्तर

7

आखिरी पैरामीटर जो पोस्ट-प्राप्त हुक stdin पर हो जाता है वह है कि क्या रेफ बदल दिया गया था, इसलिए हम इसका उपयोग यह जांचने के लिए कर सकते हैं कि वह मान "refs/head/master" था या नहीं। क्या मैं एक में उपयोग करने के लिए इसी तरह के गहरे लाल रंग का एक छोटा सा हुक के बाद प्राप्त होता है:

STDIN.each do |line| 
    (old_rev, new_rev, ref_name) = line.split 
    if ref_name =~ /master/ 
     # do your push 
    end 
end 

ध्यान दें कि यह प्रत्येक रेफरी कि धकेल दिया गया के लिए एक लाइन हो जाता है, इसलिए यदि आप सिर्फ मास्टर की तुलना में अधिक धक्का दे दिया, यह अभी भी काम करेंगे।

+0

रूबी उदाहरण के लिए धन्यवाद। मैं इस तरह कुछ करने जा रहा हूँ। – Leif

5

स्टीफन का जवाब मेरे लिए काम नहीं किया था, लेकिन this किया:

#!/bin/bash 

echo "determining branch" 

if ! [ -t 0 ]; then 
    read -a ref 
fi 

IFS='/' read -ra REF <<< "${ref[2]}" 
branch="${REF[2]}" 

if [ "master" == "$branch" ]; then 
    echo 'master was pushed' 
fi 

if [ "staging" == "$branch" ]; then 
    echo 'staging was pushed' 
fi 

echo "done" 
+0

मेरे लिए एक साधारण नाम (मास्टर, टेस्ट इत्यादि) के साथ शाखाओं के लिए काम किया, लेकिन जब मेरे पास शाखा का नाम है: prod12/proj250/ropesPatch12। यह अच्छी तरह से काम नहीं करता है। क्या आपके पास ऐसा समाधान है जो उन विशेष पात्रों के साथ काम कर सकता है? –

335

एक के बाद प्राप्त हुक रूप <oldrev> <newrev> <refname> में, stdin से अपने तर्कों हो जाता है। चूंकि ये तर्क stdin से आ रहे हैं, कमांड लाइन तर्क से नहीं, आपको $1 $2 $3 के बजाय read का उपयोग करने की आवश्यकता है।

बाद प्राप्त हुक (अगर कोई एक git push --all करता है उदाहरण के लिए) एक साथ कई शाखाओं प्राप्त कर सकते हैं, तो हम भी एक while पाश में read रैप करने के लिए की जरूरत है।

#!/bin/bash 
while read oldrev newrev refname 
do 
    branch=$(git rev-parse --symbolic --abbrev-ref $refname) 
    if [ "master" == "$branch" ]; then 
     # Do something 
    fi 
done 
+48

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। – jackyalcine

+2

"==" मेरे लिए काम नहीं करता है। एकल "=" मेरे साथ काम करता है। – Ray

+0

यह अजीब है। डबल बराबर और एकल बराबर दोनों ठीक काम करना चाहिए (देखें http://stackoverflow.com/questions/2600281/what-is-the-difference-between-operator-and-in-bash)। क्या आप संभवतः बाश के अलावा कुछ और उपयोग कर रहे हैं? भले ही, आपको इसके लिए एक फिक्स मिल गया। – pauljz

3
समाधान मेरे लिए काम किया इसके बाद के संस्करण की

न तो:

एक कार्य टुकड़ा कुछ इस तरह लग रहा है। बहुत अधिक, डिबगिंग के बाद, यह पता चला है कि 'read' कमांड का उपयोग करना काम नहीं करता है - इसके बजाए, कमांड लाइन तर्कों को पार्स करना सामान्य तरीके से ठीक काम करता है।

यहां सटीक पोस्ट-अपडेट हुक है जिसे मैंने अभी सफलतापूर्वक CentOS 6.3 पर परीक्षण किया है।

#!/bin/bash 

echo "determining branch" 

branch=`echo $1 | cut -d/ -f3` 

if [ "master" == "$branch" ]; then 
    echo "master branch selected" 
fi 

if [ "staging" == "$branch" ]; then 
    echo "staging branch selected" 
fi 

exec git update-server-info 

अद्यतन: एक और भी अजनबी नोट पर, पूर्व प्राप्त हुक stdin के माध्यम से अपने इनपुट लेता है, इसलिए (वाह, कभी नहीं सोचा था कि मैं कहना है कि चाहते हैं) 'पढ़ा' के साथ पढ़ें। पोस्ट-अपडेट हुक अभी भी मेरे लिए $ 1 के साथ काम करता है।

+2

इसके लायक होने के लिए, उपर्युक्त समाधान काम नहीं कर सकते हैं क्योंकि वे विशेष रूप से 'पोस्ट-अपडेट' हुक के लिए हैं, न कि 'पोस्ट-अपडेट' हुक। वे अपना इनपुट विभिन्न तरीकों से लेते हैं। – pauljz

+0

'पोस्ट-प्राप्त'' यहां नोटिस के रूप में stdin लेता है: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks – h4xnoodle

0

मैंने इस कार्यक्षमता को करने के लिए स्वयं के लिए एक PHP स्क्रिप्ट लिखी थी।

https://github.com/fotuzlab/githubdump-php

होस्ट अपने सर्वर पर इस फाइल को प्राथमिकता रेपो जड़ और GitHub webhooks में URL निर्दिष्ट करें। अपनी शाखा के नाम के साथ लाइन 8 पर 'allcommits' बदलें और लाइन कोड पर अपना कोड/फ़ंक्शन जोड़ें।

उदा।

function githubdump($payload_object) { 
    // Write your code here. 
    exec('git push origin master'); 
} 
0

सरल दृष्टिकोण, git hook लिखने में

read refname 
echo $refname 

सरल - इस महान लिंक hooking system

0

@pauljz pre-push जैसे कुछ Git हुक के लिए ठीक काम करता है से जवाब बारे में अधिक जानकारी के लिए, लेकिन pre-commit करता है उन चरों तक पहुंच नहीं है oldrev newrev refname

इसलिए मैंने यह वैकल्पिक संस्करण बनाया जो प्री-प्रतिबद्ध, या वास्तव में और हुक के लिए काम करता है। यह pre-commit हुक है जो husky स्क्रिप्ट चलाएगा यदि हम master शाखा पर नहीं हैं।

#!/bin/bash 
# git 'commit' does not have access to these variables: oldrev newrev refname 
# So get the branch name off the head 

branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName 
branch=${branchPath##*/}  # Get text behind the last/of the branch path 

echo "Head: $branchPath"; 
echo "Current Branch: $branch"; 

if [ "master" != "$branch" ]; then 

    # If we're NOT on the Master branch, then Do something 
    # Original Pre-push script from husky 0.14.3 

    command_exists() { 
    command -v "$1" >/dev/null 2>&1 
    } 

    has_hook_script() { 
    [ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:" 
    } 

    cd "frontend" # change to your project directory, if .git is a level higher 

    # Check if precommit script is defined, skip if not 
    has_hook_script precommit || exit 0 

    # Node standard installation 
    export PATH="$PATH:/c/Program Files/nodejs" 

    # Check that npm exists 
    command_exists npm || { 
    echo >&2 "husky > can't find npm in PATH, skipping precommit script in package.json" 
    exit 0 
    } 

    # Export Git hook params 
    export GIT_PARAMS="$*" 

    # Run npm script 
    echo "husky > npm run -s precommit (node `node -v`)" 
    echo 

    npm run -s precommit || { 
    echo 
    echo "husky > pre-commit hook failed (add --no-verify to bypass)" 
    exit 1 
    } 
fi 

मुझे उम्मीद है कि किसी की मदद करेगा। आप अपनी आवश्यकताओं के लिए आसानी से संशोधित कर सकते हैं, if और fi कथन के बीच कुछ भी।

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