ऐसा लगता है कि इस चर्चा में दो अलग-अलग परिदृश्यों को एक साथ मिलाया जा रहा है:
दृष्टांत 1
अपने माता-पिता रिपॉजिटरी के पॉइंटर्स से सबमॉड्यूल का उपयोग करते हुए, मैं प्रत्येक सबमॉड्यूल में कमिटमेंट की जांच करना चाहता हूं जो कि पेरेंट रिपॉजिटरी की ओर इशारा कर रहा है, संभवतः पहले सभी सबमॉड्यूल्स के माध्यम से पुनरावृत्ति करने और रिमोट से इन्हें अपडेट / खींचने के बाद।
यह बताया गया है, जैसा कि बताया गया है
git submodule foreach git pull origin BRANCH
git submodule update
परिदृश्य 2, जो मुझे लगता है कि ओपी का लक्ष्य क्या है
एक या अधिक सबमॉड्यूल में नया सामान हुआ है, और मैं इन बदलावों को 1) करना चाहता हूं और 2) माता-पिता के भंडार को इस / इन सबमॉडल्स के HEAD (नवीनतम) प्रतिबद्ध की ओर इंगित करता है।
इसके द्वारा किया जाएगा
git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH
बहुत व्यावहारिक नहीं है, क्योंकि आपको मूल स्क्रिप्ट रिपॉजिटरी के कमिटर्स को अपडेट करने के लिए एक स्क्रिप्ट जैसे उदाहरण में सभी एन सबमॉड्यूल के लिए n रास्तों को हार्डकोड करना होगा।
प्रत्येक सबमॉड्यूल के माध्यम से एक स्वचालित पुनरावृत्ति होना अच्छा होगा, माता-पिता के रिपॉजिटरी पॉइंटर को अपडेट करना (उपयोग करना git add
) सबमॉड्यूल (ओं) के प्रमुख को इंगित करना।
इसके लिए, मैंने यह छोटा सा बैश स्क्रिप्ट बनाया:
git-update-submodules.sh
#!/bin/bash
APP_PATH=$1
shift
if [ -z $APP_PATH ]; then
echo "Missing 1st argument: should be path to folder of a git repo";
exit 1;
fi
BRANCH=$1
shift
if [ -z $BRANCH ]; then
echo "Missing 2nd argument (branch name)";
exit 1;
fi
echo "Working in: $APP_PATH"
cd $APP_PATH
git checkout $BRANCH && git pull --ff origin $BRANCH
git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH
इसे चलाने के लिए, निष्पादित करें
git-update-submodules.sh /path/to/base/repo BRANCH_NAME
विस्तार
सबसे पहले, मैं मानता हूं कि ब्रांच $ ब्रांच (दूसरा तर्क) नाम की शाखा सभी रिपॉजिटरी में मौजूद है। इसे और भी जटिल बनाने के लिए स्वतंत्र महसूस करें।
कुछ खंडों की पहली जाँच है कि तर्क हैं। फिर जब भी मैं सिर्फ पुल कर रहा होता हूं, तब मैं अभिभावक भंडार के नवीनतम सामान को खींचता हूं (मैं उपयोग करना चाहता हूं --ff (तेजी से अग्रेषित करना)। मेरे पास रिबेट बंद है, BTW)।
git checkout $BRANCH && git pull --ff origin $BRANCH
तब कुछ सबमॉड्यूल को इनिशियलाइज़ करना आवश्यक हो सकता है, अगर नए सबमॉड्यूल्स को जोड़ा गया है या अभी तक इनिशियलाइज़ नहीं किया गया है:
git submodule sync
git submodule init
git submodule update
तब मैं सभी सबमॉडल्स को अपडेट / पुल करता हूं:
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
कुछ बातों पर ध्यान दें: सबसे पहले, मैं कुछ Git कमांड का उपयोग कर रहा हूं &&
- जिसका अर्थ है कि पिछली कमांड को बिना किसी त्रुटि के निष्पादित करना चाहिए।
एक संभावित सफल खींचने के बाद (यदि रिमोट पर नया सामान मिला था), मैं यह सुनिश्चित करने के लिए एक धक्का देता हूं कि क्लाइंट पर एक संभावित मर्ज-कम पीछे नहीं छोड़ा जाए। फिर, यह केवल तभी होता है जब वास्तव में एक सामान नए सामान में लाया जाता है।
अंत में, फाइनल || true
यह सुनिश्चित कर रहा है कि स्क्रिप्ट त्रुटियों पर जारी है। इस काम को करने के लिए, पुनरावृति में सब कुछ डबल-कोट्स में लपेटा जाना चाहिए और गिट कमांड कोष्ठक (ऑपरेटर पूर्वता) में लिपटे हुए हैं।
मेरा पसंदीदा हिस्सा:
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
सभी --quiet
सबमॉड्यूल्स को Iterate करें - जिसके साथ , 'Entering MODULE_PATH' आउटपुट निकालता है। 'echo $path'
(एकल-उद्धरण में होना चाहिए) का उपयोग करके , सबमॉड्यूल का रास्ता आउटपुट को लिखा जाता है।
रिश्तेदार सबमॉड्यूल रास्तों की यह सूची एक सरणी ( $(...)
) में कैप्चर की गई है - अंत में इसे पुनरावृत्त करें और git add $i
माता-पिता के भंडार को अपडेट करने के लिए करें।
अंत में, कुछ संदेश के साथ एक प्रतिबद्धता जो यह बताती है कि माता-पिता के भंडार को अपडेट किया गया था। यदि कुछ भी नहीं किया गया था, तो यह प्रतिबद्ध डिफ़ॉल्ट रूप से अनदेखा कर दिया जाएगा। यह मूल करने के लिए धक्का, और आप कर रहे हैं।
मेरे पास जेनकींस की नौकरी में एक स्क्रिप्ट है जो बाद में एक निर्धारित स्वचालित परिनियोजन के लिए चेन करती है, और यह एक आकर्षण की तरह काम करती है।
मुझे उम्मीद है कि यह किसी की मदद होगी।
--remote
विकल्प के माध्यम से बनाई गई कार्यक्षमता है, तो शायद यह चिह्नित करना उपयोगी होगा कि जेसन के जवाब में "हाथ से" दृष्टिकोण के बजाय स्वीकार किए गए उत्तर के रूप में?