ফাংশন সহ গিট সাবমডুল ফোরচ ব্যবহার করুন


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)", যদি না আপনি জানেন যে আপনি কোট ছেড়ে দিতে হবে। অরক্ষিত বিকল্পগুলি গ্লোব নিদর্শনগুলির হোয়াইটস্পেস-বিচ্ছিন্ন তালিকা হিসাবে ব্যাখ্যা করা হয়, যা প্রায়শই কাঙ্ক্ষিত হয় না। এছাড়াও, ব্যাকটিকগুলি ব্যবহার করবেন না, একই কারণে, $(…)পরিবর্তে ব্যবহার করুন। এখানে, এটি আসলে কিছু যায় আসে না কারণ গিট শাখার নামগুলিতে বিশেষ অক্ষর থাকে না এবং কারণ খালি থাকার সময় [ -z $branch ]পার্স করা হয়। তবে উদ্ধৃতিগুলি বাদ দেওয়ার অভ্যাসে উঠবেন না, এটি ফিরে আসবে এবং আপনাকে কামড় দেবে।[ -z ]branch

আসুন আমরা স্ক্রিপ্টটি বলা হয় pbranch-submodule, আপনি তখন চালাতে পারেন

git submodule foreach pbranch-submodule

এবং যদি আপনি এটির নাম দেন তবে git-pbranch-submoduleএটি বিল্ট-ইন গিট কমান্ডের মতো আচরণ করতে পারে: git pbranch-submoduleবা git submodule foreach git pbranch-submodule। (নোট করুন যে
ফোরচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.