सबमॉड्यूल अपडेट प्राप्त करें


242

मैं स्पष्ट नहीं हूँ कि निम्नलिखित अर्थ ( Git सबमॉड्यूल अपडेट प्रलेखन से) क्या है:

... जब तक --rebaseया --mergeनिर्दिष्ट किया जाता है , तब तक सबमॉडल्स HEAD को अलग कर दिया जाएगा ...

चीजों को कैसे --rebase/ --mergeबदलता है?

मेरा मुख्य उपयोग मामला केंद्रीय रिपॉजिटरी का एक समूह है, जिसे मैं अन्य रिपॉजिटरी में सबमोड्यूल्स के माध्यम से एम्बेड करूंगा। मैं इन केंद्रीय रिपॉजिटरी पर, या तो सीधे अपने मूल स्थान पर, या अपने एम्बेडिंग रिपॉजिटरी (जो सबमॉडल के माध्यम से उनका उपयोग करता हूं) के भीतर से सुधार करना चाहूंगा।

  • इन सबमॉड्यूल्स के भीतर, क्या मैं शाखाएं / संशोधन बना सकता हूं और पुश / पुल का उपयोग कर सकता हूं जैसे मैं नियमित रिपोजिटरी में करूंगा, या क्या इसके बारे में सतर्क रहने के लिए चीजें हैं?
  • मैं 1.0 से 1.1 (भले ही मूल रिपॉजिटरी का मुखिया पहले से ही 2.0 पर है) से सबमोड्यूल्ड रेफर किए गए कमिट को कैसे आगे बढ़ाऊंगा, या किस शाखा की कमिट का उपयोग किया जाता है?

"अलग किए गए सिर" के विषय पर, stackoverflow.com/questions/964876/head-and-orighead-in-git और stackoverflow.com/questions/237408/… को भी एक व्यावहारिक उदाहरण के लिए देखें (सबमॉड्यूल से संबंधित नहीं, लेकिन फिर भी )
वॉन

"आप मुख्य परियोजना के भीतर से सबमॉड्यूल की सामग्री को संशोधित नहीं कर सकते हैं": हाँ, सच है। और मैंने अपने जवाब को उस स्पष्ट विरोधाभास (गैर-परिवर्तनीय सबमॉड्यूल) पर कुछ प्रकाश डालने के लिए संपादित किया है, जिसे आप अभी भी मुख्य परियोजना रेपो से संशोधित कर सकते हैं!)
वॉन

जवाबों:


304

यह GitPro पेज अच्छी तरह से git सबमॉड्यूल अपडेट के परिणाम को संक्षेप में प्रस्तुत करता है

जब आप चलते हैं git submodule update, तो यह परियोजना के विशिष्ट संस्करण की जांच करता है, लेकिन एक शाखा के भीतर नहीं। इसे एक अलग सिर कहा जाता है - इसका मतलब है कि हेड फाइल सीधे एक कमिटमेंट के लिए है, न कि एक प्रतीकात्मक संदर्भ के लिए।
मुद्दा यह है कि आप आमतौर पर एक अलग वातावरण में काम नहीं करना चाहते हैं, क्योंकि परिवर्तनों को खोना आसान है
यदि आप एक प्रारंभिक सबमॉड्यूल अपडेट करते हैं, तो काम करने के लिए एक शाखा बनाए बिना उस सबमॉड्यूल निर्देशिका में प्रतिबद्ध करें, और फिर बीच में कमिट किए बिना सुपरप्रोजेक्ट से फिर से git सबमॉड्यूल अपडेट चलाएं, Git आपको बिना बताए आपके परिवर्तनों को अधिलेखित कर देगा। तकनीकी रूप से आप काम नहीं खोएंगे, लेकिन आपके पास इसकी ओर इशारा करने वाली शाखा नहीं होगी, इसलिए इसे पुनर्प्राप्त करना थोड़ा मुश्किल होगा।


नोट मार्च 2013:

जैसा कि " गिट सबमॉड्यूल ट्रैकिंग लेटेस्ट " में बताया गया है, एक सबमॉडल अब (git1.8.2) एक शाखा को ट्रैक कर सकता है।

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

" git submodule update --remoteबनामgit pull " देखें ।

माइंडटूथ का उत्तर एक मैनुअल अपडेट (स्थानीय कॉन्फ़िगरेशन के बिना) को चित्रित करता है:

git submodule -q foreach git pull -q origin master

दोनों ही मामलों में, जो सबमोड्यूल्स संदर्भों ( गीटलिंक , पेरेंट रेपो इंडेक्स में एक विशेष प्रविष्टि ) को बदल देगा, और आपको मुख्य रेपो से उक्त संदर्भों को जोड़ना, कमिट करना और पुश करना होगा।
अगली बार जब आप उस मूल रेपो का क्लोन बनाएंगे, तो यह उन नए SHA1 संदर्भों को दर्शाने के लिए सबमॉड्यूल्स को आबाद करेगा।

इस उत्तर के बाकी हिस्सों में क्लासिक सबमॉडल फीचर (एक निश्चित प्रतिबद्ध के संदर्भ , जो एक सबमॉड्यूल की धारणा के पीछे सभी बिंदु है) का विवरण देता है।


इस समस्या से बचने के लिए, जब आप सबमॉड्यूल डायरेक्टरी में काम करते हैं तो git checkout -b वर्क या कुछ समकक्ष के साथ एक ब्रांच बनाएं। जब आप दूसरी बार सबमॉड्यूल अपडेट करते हैं, तब भी यह आपके काम को वापस कर देगा, लेकिन कम से कम आपके पास वापस जाने के लिए एक पॉइंटर है।

उन में सबमॉड्यूल के साथ शाखाओं को बदलना भी मुश्किल हो सकता है। यदि आप एक नई शाखा बनाते हैं, तो वहां एक सबमॉड्यूल जोड़ें, और फिर उस सबमॉड्यूल के बिना एक शाखा में वापस जाएं, फिर भी आपके पास एक अनट्रेड निर्देशिका के रूप में सबमॉड्यूल निर्देशिका है:


तो, आपके सवालों के जवाब देने के लिए:

क्या मैं शाखाओं / संशोधनों को बना सकता हूं और नियमित रिपॉजिट में जैसे मैं करूंगा, वैसे ही पुश / पुल का उपयोग कर सकता हूं या क्या इस बारे में सतर्क रहना चाहिए?

आप एक शाखा बना सकते हैं और संशोधनों को आगे बढ़ा सकते हैं।

चेतावनी ( Git Submodule ट्यूटोरियल से ): हमेशा प्रकाशित करें (पुश) प्रकाशन से पहले सबमॉड्यूल परिवर्तन (पुश) सुपरप्रोजेक्ट के लिए परिवर्तन जो इसे संदर्भित करता है। यदि आप सबमॉड्यूल परिवर्तन प्रकाशित करना भूल जाते हैं, तो अन्य लोग रिपॉजिटरी का क्लोन नहीं बना पाएंगे।

मैं 1.0 से 1.1 (भले ही मूल रेपो के प्रमुख पहले से ही 2.0 पर है) (कहे जाने वाले) टैग से उप-संदर्भित संदर्भ को आगे कैसे बढ़ाऊंगा

" अंडरमॉडल्स को समझना " पेज मदद कर सकता है

गिट सबमॉडल्स को दो चलती भागों का उपयोग करके कार्यान्वित किया जाता है:

  • .gitmodulesफ़ाइल और
  • एक विशेष प्रकार की वृक्ष वस्तु।

ये एक साथ एक विशिष्ट रिपॉजिटरी के एक विशिष्ट संशोधन को त्रिकोणित करते हैं जिसे आपकी परियोजना में एक विशिष्ट स्थान पर चेक आउट किया जाता है।


से Git submodule पेज

आप मुख्य परियोजना के भीतर से सबमॉड्यूल की सामग्री को संशोधित नहीं कर सकते

100% सही: आप एक सबमॉड्यूल को संशोधित नहीं कर सकते हैं, केवल इसके एक कमिट को देखें।

यही कारण है, जब आप मुख्य परियोजना के भीतर से एक सबमॉड्यूल को संशोधित करते हैं, तो आप:

  • सबमॉड्यूल (अपस्ट्रीम मॉड्यूल के लिए) के भीतर प्रतिबद्ध और पुश करने की आवश्यकता है , और
  • फिर अपने मुख्य प्रोजेक्ट में ऊपर जाएं, और नए सबमॉडल को संदर्भित करने के लिए उस मुख्य प्रोजेक्ट के लिए फिर से कमिट करें (आपके द्वारा अभी बनाया गया और धकेल दिया गया)

एक सबमॉड्यूल आपको एक घटक-आधारित दृष्टिकोण विकास करने में सक्षम बनाता है , जहां मुख्य परियोजना केवल अन्य घटकों (यहां "अन्य गिट रिपॉजिटरी को उप-मॉड्यूल के रूप में घोषित किया जाता है) के विशिष्ट आवागमन को संदर्भित करता है।"

एक सबमॉडल एक अन्य Git रिपॉजिटरी के लिए एक मार्कर (कमिट) है जो मुख्य परियोजना विकास चक्र से बाध्य नहीं है: यह ("अन्य" Git रेपो) स्वतंत्र रूप से विकसित हो सकता है।
यह मुख्य परियोजना पर निर्भर है कि जो भी इसके लिए आवश्यक है, वह अन्य रेपो से चुन सकता है।

हालांकि, अगर आप चाहते हैं, चाहिए सुविधा से बाहर , अपने मुख्य परियोजना से सीधे उन submodules में से एक, संशोधित करने, Git बशर्ते आप, आप ऐसा करने की अनुमति देता पहले अपने मूल Git रेपो करने के लिए उन submodule संशोधनों प्रकाशित करें, और उसके बाद अपने मुख्य परियोजना की चर्चा करते हुए प्रतिबद्ध एक नए कहा submodule के संस्करण।

लेकिन मुख्य विचार बना हुआ है: विशिष्ट घटकों को संदर्भित करना जो:

  • उनका अपना जीवनचक्र है
  • टैग का अपना सेट है
  • उनका अपना विकास है

आपके मुख्य प्रोजेक्ट में आपके द्वारा निर्दिष्ट विशिष्ट कमिट्स की सूची आपके कॉन्फ़िगरेशन को परिभाषित करती है (यह कॉन्फ़िगरेशन प्रबंधन के बारे में है, जो मात्र संस्करण नियंत्रण प्रणाली को संलग्न करता है। )

यदि कोई घटक वास्तव में आपकी मुख्य परियोजना के रूप में उसी समय विकसित किया जा सकता है (क्योंकि मुख्य परियोजना में कोई भी संशोधन उप-निर्देशिका और इसके विपरीत को संशोधित करना शामिल होगा), तो यह एक "सबमॉड्यूल" होगा, लेकिन कोई और नहीं सबट्री मर्ज (यह भी प्रश्न में प्रस्तुत किया गया था कि सीवीएस से वितरित रिपॉजिटरी के लिए विरासत कोड आधार को स्थानांतरित करना ), दोनों गिट रेपो के इतिहास को एक साथ जोड़ते हैं।

क्या यह Git Submodules के वास्तविक स्वरूप को समझने में मदद करता है?


77
वाह। उस चीज के लिए एक लंबी व्याख्या जो मुख्य रूप से है कि सरल होना चाहिए किसी भी नवागंतुक को सिर्फ अपने svn के साथ चिपकाने के लिए पर्याप्त होने के लिए: बाहरी। ;-)
conny

2
@conny: लेकिन, जैसा कि मैंने " क्यों एक्सन बाह्य उपकरणों के साथ असंगत git सबमॉड्यूल्स हैं? " में विस्तार से बताया, सबमॉडल्स मौलिक भिन्न हैं और संगत नहीं हैं svn:externals
VonC

1
क्षमा करें, अपने स्वयं के प्रश्न का उत्तर देने के लिए, मैं सबमॉड्यूल में cd'ing इकट्ठा करता हूं और एक चेक को git चेकआउट करता हूं, या git pull / fetch ठीक करेगा। फिर स्थानीय रिपॉजिटरी में अपडेट शुरू करना।
हेनरिक

2
@ समय: आप एक बार प्रयोग करके सभी सबमॉडल्स पर भी प्रहार कर सकते हैंgit submodule foreach
दाव क्लार्क

1
.. अभी भी नहीं मिल रहा है। कहीं वेब पर एक आसान व्याख्या नहीं है?
यूजीन

135

प्रत्येक सबमॉड्यूल को अपडेट करने के लिए, आप निम्नलिखित कमांड (रिपॉजिटरी के मूल में) को इनवॉइस कर सकते हैं:

git submodule -q foreach git pull -q origin master

आप पूरी प्रक्रिया का पालन करने के लिए -q विकल्प को हटा सकते हैं ।


15
यदि आप बस git submodule update --init --recursiveरूट से चलते हैं, तो यह उन सभी को पुन: प्राप्त करेगा और यदि पहले से ही नहीं है तो उन्हें इनिशियलाइज़ कर देगा।
सैम सोफेस

10
@SamSoffes जो पूरी तरह से एक अलग उद्देश्य प्रदान करता है। सबमॉड्यूल्स को अपडेट करने से कमोडोड्यूल्स की जांच हो जाएगी कि वे वर्तमान में इशारा कर रहे हैं (जरूरी नहीं कि नवीनतम कमिट)। उपरोक्त उत्तर में समाधान मूल / मास्टर से नवीनतम HEAD के लिए प्रत्येक सबमॉड्यूल की प्रतिबद्धता को अद्यतन करता है।
इंड्रैजी

7
मेरी नई विधि:git submodule update --rebase --remote
माइंडट्यूट

19

--rebaseबनाम --mergeविकल्प को संबोधित करने के लिए :

मान लीजिए कि आपके पास सुपर रिपॉजिटरी ए और सबमॉड्यूल बी है और सबमॉड्यूल बी में कुछ काम करना चाहते हैं। आपने अपना होमवर्क कर लिया है और जानते हैं कि कॉल करने के बाद

git submodule update

आप एक हेड-कम स्थिति में हैं, इसलिए इस समय आप जो भी काम करते हैं, उसे वापस करना मुश्किल है। इसलिए, आपने सबमॉड्यूल बी में एक नई शाखा पर काम शुरू किया है

cd B
git checkout -b bestIdeaForBEver
<do work>

इस बीच, प्रोजेक्ट ए में किसी और ने फैसला किया है कि बी का नवीनतम और सबसे बड़ा संस्करण वास्तव में ए का हकदार है। आप आदत से बाहर हैं, सबसे हाल के बदलावों को मर्ज करें और अपने सबमॉड्यूल्स को अपडेट करें।

<in A>
git merge develop
git submodule update

अरे नहीं! आप फिर से एक बिना सिर के राज्य में वापस आ रहे हैं, शायद इसलिए कि बी अब बी के नए सिरे, या कुछ अन्य प्रतिबद्ध से जुड़े SHA की ओर इशारा कर रहा है। यदि केवल आपके पास था:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

अब बी के लिए अब तक का सबसे अच्छा विचार नई प्रतिबद्ध पर बगावत कर दिया गया है, और इससे भी महत्वपूर्ण बात, आप अभी भी बी के लिए अपनी विकास शाखा पर हैं, न कि एक बिना सिर के राज्य में!

( --mergeआपके कार्य शाखा में afterUpdateSHA से afterUpdateSHA में परिवर्तन को मर्ज कर देगा, जैसा कि afterUpdateSHA पर आपके परिवर्तनों को पुन: जारी करने का विरोध करता है।)


7

Git 1.8.2 में एक नया विकल्प है --remote, जो इस व्यवहार को ठीक से सक्षम करेगा। चल रहा है

git submodule update --rebase --remote

प्रत्येक सबमॉड्यूल में अपस्ट्रीम से नवीनतम बदलाव लाएंगे, उन्हें रिबेट करेंगे और सबमॉडल के नवीनतम संशोधन की जांच करेंगे। जैसा कि प्रलेखन यह कहता है:

--remote

यह विकल्प केवल अपडेट कमांड के लिए मान्य है। सबमॉड्यूल को अपडेट करने के लिए सुपरप्रोजेक्ट के रिकॉर्डेड SHA-1 का उपयोग करने के बजाय, सबमॉड्यूल की रिमोट-ट्रैकिंग शाखा की स्थिति का उपयोग करें।

यह चलने के बराबर है git pull प्रत्येक सबमॉड्यूल में , जो आम तौर पर वास्तव में आप क्या चाहते हैं।

(यह इस उत्तर से कॉपी किया गया था ।)


यदि आप एक पुराने प्रश्न का उत्तर देने का निर्णय लेते हैं, जो अच्छी तरह से स्थापित और सही उत्तर देता है, तो दिन में देर से एक नया उत्तर जोड़ने से आपको कोई क्रेडिट नहीं मिल सकता है। यदि आपके पास कुछ विशिष्ट नई जानकारी है, या आप आश्वस्त हैं कि अन्य उत्तर सभी गलत हैं, तो सभी तरीकों से एक नया उत्तर जोड़ सकते हैं, लेकिन 'अभी तक एक और उत्तर' एक ही मूल जानकारी देने के बाद जब प्रश्न पूछा जाता है तो आमतौर पर जीता जाता है ' टी आप बहुत क्रेडिट कमाते हैं। यह क्या करता है की कोई व्याख्या नहीं है - बाहरी प्रलेखन का लिंक भी नहीं (जो पर्याप्त नहीं होगा)।
जोनाथन लेफ्लर

2
यह "अभी तक एक और जवाब" नहीं है, क्योंकि कोई अन्य उत्तर में यह आदेश नहीं है (मुझे गलत साबित करें)। अन्य उत्तरों ने मेरे लिए काम नहीं किया, इस टिप्पणी ने किया, इसलिए मैंने मूल स्वामी को श्रेय देते हुए इसे उत्तर के रूप में पोस्ट करने का निर्णय लिया। इसलिए अपने पतन को दूर करने पर विचार करें।
इयूलियन ओनोफ्रेई

2015 के माइंडटूथ की एक टिप्पणी है कि यह वही है जो वे अब करते हैं। आप इस बारे में कोई स्पष्टीकरण नहीं देते हैं कि यह क्या करता है (हालांकि आप माइंडटूथ का उल्लेख करते हैं, लेकिन इस बात का कोई वास्तविक स्पष्टीकरण नहीं है कि आपके द्वारा इसका अर्थ क्या है - इस टिप्पणी के अनुसार, URL एम्बेड करना, मदद करेगा)। आप यह नहीं कहते कि यह एक अच्छा विचार क्यों है। आप कोई चेतावनी नहीं देते। यह मेरे विचार में, एक उपयोगी उत्तर नहीं है क्योंकि यह संकल्प से अधिक प्रश्न उठाता है।
जोनाथन लेफ्लर

1
उसके द्वारा, मेरा मतलब था कि यह काम नहीं करने के बजाय काम करता है । मेरा विश्वास करो, यदि अधिक लोगों को यह जवाब देखना था, तो उन्हें खुशी होगी, क्योंकि यह काम करता है । इस तरह की चीजों के लिए, अधिकांश लोग बस उस कमांड को जानना चाहते हैं जो एक गिट सबमॉडल को अपडेट करता है, न कि इसे कैसे लागू किया जाता है।
इयूलियन ओनोफ्रेई

मैंने आपको गलत साबित करने का उत्तर संपादित किया, इसके अलावा, stackoverflow.com/questions/1979167/git-submodule-update/… !!!
इयूलियन ओनोफ्रेई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.