फ़ंक्शन के साथ git सबमॉड्यूल फ़ॉरच का उपयोग करें


10

मेरी नज़र में एक स्क्रिप्ट है जो सभी गिट सबमॉडल्स को अपडेट करती है जिसके अनुसार शाखा दी गई है। यदि सबमॉडल के लिए ऐसी कोई शाखा नहीं है, तो मास्टर का उपयोग किया जाता है।

मेरे पास अब यही है:

#!/bin/bash -x

if [ -z $1 ]; then
    echo "Branch name required."
    exit
fi

function pbranch {
    exists=`git show-ref refs/heads/$branch`

    if [ -z $exists ]; then
        branch="master"
    fi

    git co $branch
    git pull origin $branch
}

branch=$1

git submodule foreach pbranch

लेकिन इस स्क्रिप्ट को चलाते समय, त्रुटि को फेंक दिया जाता है:

oleq@pc ~/project> git-fetchmodules major
+ '[' -z major ']'
+ branch=major
+ git submodule foreach pbranch
Entering 'submodule'
/usr/lib/git-core/git-submodule: 1: eval: pbranch: not found
Stopping at 'submodule'; script returned non-zero status.

मेरा अनुमान है कि यह git submodule foreachनिष्कासन ( प्रलेखन के अनुसार ) का उपयोग करता है, जिसका मैं इस संदर्भ में सही उपयोग नहीं करता।

"इनलाइन कॉलबैक" के साथ इस कमांड का उपयोग करने के लाखों उदाहरण हैं , लेकिन मुझे फ़ंक्शन के रूप में कॉलबैक के साथ एक भी नहीं मिला। कुछ पता है इसे कैसे हल करना है?

जवाबों:


7

मैंने कॉलबैक के रूप में फ़ंक्शन को उद्धरण के अंदर रखकर मेरी समस्या का समाधान किया:

#!/bin/bash

if [ -z $1 ]; then
    echo "Branch name required."
    exit
fi

git submodule foreach "
    branch=$1;
    exists=\$(git show-ref refs/heads/\$branch | cut -d ' ' -f1);

    if [ -z \$exists ]; then
        branch='master';
    fi;

    echo Checking branch \$branch for submodule \$name.;

    git fetch --all -p;
    git co \$branch;
    git reset --hard origin/\$branch;
"

ध्यान दें कि वे चर जैसे $1स्क्रिप्ट के नाम स्थान से हैं। "बच गए लोगों" की तरह $\(bar), \$branch"कॉलबैक" के भीतर मूल्यांकन किया जाता है। यह बहुत आसान था।


7

आप फ़ंक्शन का उपयोग कर सकते हैं, लेकिन आपको उन्हें पहले निर्यात करने की आवश्यकता है:

export -f pbranch

इसके अलावा, यदि आप बैश सिंटैक्स एक्सटेंशन चाहते हैं, तो आप बैश शेल को शुरू करने के लिए बाध्य करना चाह सकते हैं:

git submodule foreach bash -c 'pbranch'

5

एक शेल फ़ंक्शन केवल शेल के अंदर मौजूद होता है जहां इसे परिभाषित किया जाता है। इसी तरह, एक जावा विधि केवल प्रोग्राम इंस्टेंस में मौजूद है जहां इसे परिभाषित किया गया है, और इसी तरह। आप किसी अन्य प्रोग्राम से शेल फ़ंक्शन को आमंत्रित नहीं कर सकते, भले ही वह प्रोग्राम किसी अन्य शेल का हो जो मूल शेल के चाइल्ड प्रोसेस द्वारा चलाया जाता है।

किसी फ़ंक्शन को परिभाषित करने के बजाय, pbranchएक अलग स्क्रिप्ट बनाएं । इसे अपने पेट में डालें।

#!/bin/sh
branch="$1"
ref="$(git show-ref "refs/heads/$branch")"
if [ -z "$ref" ]; then
    branch="master"
fi
git co "$branch"
git pull origin "$branch"

शैल प्रोग्रामिंग ध्यान दें: चर प्रतिस्थापन और आदेश प्रतिस्थापन के आसपास हमेशा डाल डबल कोट्स: "$foo", "$(foo)", जब तक आप जानते हैं कि आप उद्धरण बाहर छोड़ने के लिए की जरूरत है। असुरक्षित प्रतिस्थापन को ग्लोब पैटर्न की व्हॉट्सएप-अलग-अलग सूचियों के रूप में व्याख्या की जाती है, जो लगभग कभी भी वांछित नहीं है। इसके अलावा, इसी तरह के कारणों के लिए, बैकटिक्स का उपयोग न करें, $(…)इसके बजाय उपयोग करें । यहाँ, यह वास्तव में बात नहीं क्योंकि Git शाखा के नाम विशेष वर्ण नहीं है नहीं करता है, और क्योंकि [ -z $branch ]के रूप में पार्स किया गया है [ -z ]जो भी सच है जब branchखाली है। लेकिन उद्धरणों को छोड़ने की आदत न डालें, यह आपको वापस आकर काटेगा।

मान लीजिए कि स्क्रिप्ट कहा जाता है pbranch-submodule, तो आप चला सकते हैं

git submodule foreach pbranch-submodule

और यदि आप इसे नाम देते हैं git-pbranch-submodule, तो यह बिल्ट-इन git कमांड की तरह व्यवहार कर सकता है: git pbranch-submoduleया git submodule foreach git pbranch-submodule। (ध्यान दें कि
फॉरच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.