नवीनतम कमिट के लिए एक सबमॉड्यूल अपडेट करें


269

मेरे पास एक प्रोजेक्ट A है जो एक लाइब्रेरी है और इसका उपयोग प्रोजेक्ट B में किया जाता है।

ए और बी दोनों परियोजनाओं में बी के अंदर जीथबूट पर एक अलग भंडार है, हमारे पास ए का एक सबमॉड्यूल है।

मैंने लाइब्रेरी पर कुछ कक्षाएं संपादित कीं, जो कि रेपो ए में है, मैंने रिमोट रेपो पर धकेल दिया, इसलिए लाइब्रेरी (रेपो ए) अपडेटेड है।

ये अपडेट "संदर्भ" (सबमॉड्यूल) पर प्रतिबिंबित नहीं करते हैं। सबमॉड्यूल एक पिछली कमिट को संदर्भित करता है .... मुझे गिट पर सबमॉडल अपडेट करने के लिए क्या करना चाहिए?

जवाबों:


358

सबमॉड्यूल निर्देशिका दर्ज करें:

cd projB/projA

रेपो को आप प्रोजेक्ट A से खींचें ( आपके माता-पिता, प्रोजेक्ट B के git स्टेटस को अपडेट नहीं करेंगे ):

git pull origin master

रूट निर्देशिका और अद्यतन की जाँच करने के लिए वापस जाएँ:

cd ..
git status

यदि सबमॉड्यूल पहले अपडेट किया गया है, तो यह नीचे जैसा कुछ दिखाएगा:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

फिर, अद्यतन करें:

git add projB/projA
git commit -m "projA submodule updated"

अपडेट करें

जैसा कि @paul ने बताया, git 1.8 के बाद से, हम उपयोग कर सकते हैं

git submodule update --remote --merge

नवीनतम रिमोट कमिट के लिए सबमॉड्यूल को अद्यतन करने के लिए। यह ज्यादातर मामलों में सुविधाजनक होगा।


35
BTW, यदि आप git submodule updateसबमॉड्यूल के मालिक नहीं हैं, तो आप बस तब कर सकते हैं जब किसी और ने प्रोज को अपडेट किया हो (आपको एक नई कमिट आईडी मिल जाएगी)।
किजुल

मैं सबमॉड्यूल मेन रेपो (प्रोज ए) का मालिक हूं, लेकिन मैं प्रोज बी में एक कमिटर हूं
मोटा

@Kjuly प्रतिबद्ध होने के बाद, कोई इसे रिमोट पर कैसे धकेलता है? क्या यह सिर्फ है git push?
KR29

1
@ KR29 सही है, और पूर्ण cmd है git push <remote> <branch>, उदा git push origin dev
काजुल

2
git submodule updateकेवल उन झंडे के बिना काम करता है जब एक कमिट खींची गई है (proj B में) जो refs को सबमॉड्यूल (s) को प्रश्न (proj A) में अपडेट करता है। HEADProj A के लिए दूरस्थ ट्रैकिंग शाखा के संदर्भ में proj B को अपडेट करने के लिए, आप git submodule update --remote --mergeपॉल हैचर के उत्तर में दिखाए अनुसार करना चाहेंगे ।
बेन बर्न्स

109

जीआईटी 1.8 के बाद से आप कर सकते हैं

git submodule update --remote --merge

यह सबमॉडल को नवीनतम रिमोट कमेटी में अपडेट करेगा। फिर आपको परिवर्तन करने की आवश्यकता होगी ताकि जनक रिपॉजिटरी में gitlink अपडेट हो जाए

git commit

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


हालांकि मैं git commitबाकी सभी को अभी भी नहीं देख रहा हूं । On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
मैक्स एन

1
क्या आपने अपनी प्रतिबद्धता के बाद एक "गिट पुश" किया है, भालू मन में अपने स्थानीय भंडार को बदल देता है, आपको इसे देखने के लिए हर किसी के लिए रिमोट पर धक्का देना होगा
पॉल हैचर

इस उत्तर से गुम (लेकिन नीचे अन्य उत्तरों में उल्लेख किया गया है): अपडेट किए गए सबमॉड्यूल (एस) को कमिट करने git addसे पहले मंचन करने की आवश्यकता है।
joshng

1
@ जोशंगे मुझे लगता है कि हर कोई जो इस बिंदु पर है कि वे सबमोडुल्स पर काम कर रहे हैं वह समझ जाएगा। यह एकमात्र पोस्ट है जिसने मेरी मदद की, बहुत बहुत धन्यवाद।
हस्क Rekoms

38

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

git status

कुछ इस तरह दिखाएगा:

modified:
   some/path/to/your/submodule

तथ्य यह है कि सबमॉड्यूल सिंक से बाहर है, के साथ भी देखा जा सकता है

git submodule

उत्पादन दिखाएगा:

+afafaffa232452362634243523 some/path/to/your/submodule

प्लस इंगित करता है कि आपका सबमॉड्यूल आगे की ओर इशारा कर रहा है जहां शीर्ष रेपो को इंगित करने की उम्मीद है।

बस यह परिवर्तन जोड़ें:

git add some/path/to/your/submodule

और इसे प्रतिबद्ध करें:

git commit -m "referenced newer version of my submodule"

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

git submodule update

सबमॉड्यूल के बारे में अधिक जानकारी यहां पाया जा सकता है http://progit.org/book/ch6-6.html


यदि आप +दौड़ते समय नहीं देखते हैं git submodule, तो सुनिश्चित करें कि आपने सबमोडुल्स को इनिशियलाइज़ और इम्पोर्ट किया है। उसके लिए आदेश क्रमशः हैं git submodule initऔर git submodule update
fureigh


2

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

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

git submodule foreach "git fetch && git reset --hard origin/master"

नोट: यह प्रत्येक submodule पर हार्ड रीसेट जाएगा - अगर आप यह नहीं चाहता, आप बदल सकते हैं --hardकरने के लिए --soft


1

मेरी परियोजना को सबमॉड्यूल के लिए 'नवीनतम' का उपयोग करना चाहिए। Mac OSX 10.11 पर, git संस्करण 2.7.1, मुझे इसके कमोड्यूल फ़ोल्डर में '' जाने की जरूरत नहीं थी ताकि इसके कमिट्स को इकट्ठा किया जा सके। मैंने केवल एक नियमित किया

git pull --rebase 

शीर्ष स्तर पर, और इसने मेरे सबमॉडल को सही ढंग से अपडेट किया।


0

एंडी की प्रतिक्रिया ने $ रास्ते से बचकर मेरे लिए काम किया:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

संभवतः @Andy Webov के जवाब से बचने की आवश्यकता नहीं थी, क्योंकि उन्होंने पथ के चारों ओर एकल उद्धरण का उपयोग किया था, जैसे। '$path'
S0AndS0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.