अद्यतन सबमॉडुल्स को पुन: अद्यतन करें


283

मेरा प्रोजेक्ट स्ट्रेंथ

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

मैं सबमॉड्यूल को पुनरावर्ती रूप से कैसे अपडेट कर सकता हूं? मैंने पहले ही कुछ git कमांड की कोशिश की (ProjectA रूट पर)

git submodule foreach git pull origin master

या

git submodule foreach --recursive git pull origin master

लेकिन ट्विग की फाइल नहीं खींच सकते।


कैसे गहरी के बारे में ?
मैथ्यू कुरियन

जवाबों:


608
git submodule update --recursive

आप शायद - Theit विकल्प का भी उपयोग करना चाहते हैं, जो इसे किसी भी गैर-पंजीकृत सबमॉड्यूल को इनिशियलाइज़ कर देगा:

git submodule update --init --recursive

नोट: Git के कुछ पुराने संस्करणों में , यदि आप --initविकल्प का उपयोग करते हैं , तो पहले से ही आरंभिक सबमॉड्यूल अपडेट नहीं किए जा सकते हैं। उस स्थिति में, आपको --initविकल्प के बिना भी कमांड चलाना चाहिए ।


1
कैसे पुनरावर्ती जोड़ सबमॉड्यूल के बारे में? "git submodule add फ्रेमवर्क.एजित जोड़ें" फ्रेमवर्क की फाइलें खींचें।
कॉम्पलेज़

2
आप बस एक "git सबमॉड्यूल ऐड ब्लाह" कर सकते हैं और फिर "git सबमॉड्यूल अपडेट - इनिट - क्रेसीसिव" कर सकते हैं।
drewag

क्या यह मेरे नीचे के रास्ते से अलग है?
विलियम एंट्रीकेन

3
@Ireau पहले से आरंभिक सबमॉड्यूल के बारे में नोट को अपडेट नहीं किया जा रहा है यदि --initइसका उपयोग Git 2.2.2 पर मेरे अनुभवों से मेल नहीं खाता है। मैं दोनों शीर्ष-स्तरीय और नेस्टेड सबमॉड्यूल देखता हूं git submodule update --init --recursive, जिनका उपयोग करते समय पहले से ही सही तरीके से जांच की जा रही है , और मुझे लगता है कि आप के साथ कमांड को चलाने की आवश्यकता है और इसके बिना --initबस गलत है। जब तक कोई व्यक्ति या तो सबूत नहीं दिखा सकता है कि यह व्यवहार है या प्रदर्शित करता है कि यह संस्करणों के बीच बदल गया है और एक बार सच था, मैं इसे पूरी तरह से संपादित करने की योजना बना रहा हूं।
मार्क अमेरी

3
@ मार्की, मुझे यह याद है कि मुझे याद नहीं होने वाले कुछ संस्करणों में एक समस्या है। मैंने सिर्फ 1.9.3 में इसका परीक्षण किया और समस्या अब मौजूद नहीं है। मैंने अस्पष्ट "पुराने संस्करणों" को संदर्भित करने के लिए उत्तर को अपडेट किया। यदि कोई यह निर्दिष्ट कर सकता है कि किस संस्करण ने इस व्यवहार को बदल दिया, तो यह बहुत अच्छा होगा।
16

35

मेरे उपयोग करने का तरीका है:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
मैंने अंतिम पंक्ति को बदलने के लिए काम किया:git submodule foreach git pull --ff-only origin master
गिल्ड पेलेग

2
मैं अंतिम पंक्ति में --recursive को भी जोड़ दूंगा: "git सबमॉडल foreach --recursive git मर्ज ओरिजिनल मास्टर" अन्यथा आप एक गंदे सबमॉडल प्राप्त कर सकते हैं जब उसने खुद एक सबमॉड्यूल अपडेट किया हो।
माइकल स्कॉट कटहबर्ट

पिछले तीन घंटे से इसकी तलाश कर रहे थे। धन्यवाद महोदय। इसे जोड़ने के लिए, आप इन आदेशों का उपयोग करने के लिए भी कर सकते हैं, जैसे git submodule foreach --recursive 'git commit -a | :':। :यह पाश परिणाम की परवाह किए बिना बनाता है। लिंक stackoverflow.com/questions/19728933/… देखें ।
नवेली पिजन

17

जैसा कि यह हो सकता है कि आपके सबमॉडल्स की डिफ़ॉल्ट शाखा नहीं है master (जो मेरे मामले में बहुत कुछ होता है), यह है कि मैं पूर्ण गिट उपमॉडल के उन्नयन को स्वचालित कैसे करता हूं:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

मैंने अपने सामान्य मेकफाइल में इस कमांड को जोड़ने का प्रयास किया, फिर भी मैं जीएनयू बनाने के लिए अभी भी अटका हुआ हूं । सरल उद्धरणों के भीतर मौजूद होने के बावजूद $ (...) अनुक्रम की व्याख्या को अनदेखा करें। किसी को एक विचार है?
सेबेस्टियन वरेट्टे

आपकी आज्ञा वही है जो मुझे धन्यवाद की आवश्यकता है! लेकिन मुझे मिलता है: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.जहां Core सबमॉडल है
सानंद्रिया

इसके अलावा, मुझे लगता है कि आपको इस टिप्पणी का पता लगाने की आवश्यकता है stackoverflow.com/a/18008139/3383543
अहमद अलमुग्रेबी

पुनरावर्ती विकल्प न होने का मतलब यह है कि यह केवल तभी काम करता है जब आपके सबमॉड्यूल में सबमॉड्यूल्स फिर से शामिल न हों।
एरिकबवर्क

15

हाल ही में Git में (मैं v2.15.1 का उपयोग कर रहा हूं), निम्नलिखित अपस्ट्रीम सबमॉड्यूल परिवर्तनों को मर्ज किए जाने वाले सबमॉड्यूल में विलय कर देगा:

git submodule update --recursive --remote --merge

आप --initकिसी भी असंगठित सबमॉड्यूल को इनिशियलाइज़ करने के लिए जोड़ सकते हैं और उपयोग --rebaseकर सकते हैं यदि आप मर्ज करने के बजाय रीबेस करना चाहते हैं।

आपको बाद में परिवर्तन करने की आवश्यकता है:

git add . && git commit -m 'Update submodules to latest revisions'

यह, मुझे लगा कि मैं कुछ गलत कर रहा हूं, लेकिन आपके उत्तर ने मुझे पुष्टि दी कि git submodule update --remote my-dir/my-submoduleकाम करता है
iomv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.