Git Submodule पॉइंटर को वापस रखने के लिए कैसे युक्त भंडार में रखा गया है?


128

मेरे मुख्य git रेपो में एक git सबमॉड्यूल है। जैसा कि मैंने इसे समझा, मुख्य रेपो एक SHA मान (कहीं ...) संग्रहीत करता है, जो कि सबमॉडल की विशिष्ट प्रतिबद्धताओं की ओर इशारा करता है कि यह "जुड़ा हुआ है"।

मैं अपने सबमॉडल में गया और टाइप किया git checkout some_other_branch। मुझे पता नहीं है कि मैं किस अपराध से आया हूं।

मैं उस पॉइंटर को वापस करना चाहूंगा ताकि मुख्य रेपो और सबमॉड्यूल फिर से सिंक हो जाएं।

मेरी पहली (शायद भोली) वृत्ति यह कहने की थी git reset --hard- जो हर चीज के लिए काम करती है। मेरे आश्चर्य के लिए, यह इस परिदृश्य के लिए काम नहीं किया।

इसलिए मुझे पता चला है कि मैं टाइप कर सकता हूं git diff, SHA आईडी पर ध्यान दें जो सबमॉड्यूल पॉइंटर का उपयोग करता था, और फिर सबमॉड्यूल में सिर और git checkout [SHA ID]... लेकिन निश्चित रूप से एक आसान तरीका होना चाहिए?

जैसा कि मैं अभी भी गिट सबमॉडल्स के बारे में सीख रहा हूं, कृपया मेरी शब्दावली को ठीक करने के लिए स्वतंत्र महसूस करें यदि ऐसी अवधारणाएं हैं जो मुझे नहीं पता हैं।

जवाबों:


167

आप अपने सबमॉड्यूल को अपडेट करना चाहते हैं, इसलिए यह इस बात के साथ है कि माता-पिता के भंडार का मानना ​​है कि यह क्या होना चाहिए। अद्यतन कमांड के लिए यह है:

सबमॉड्यूल मैनपेज से:

पंजीकृत सबमॉड्यूल्स को अपडेट करें, यानी क्लोनिंग सबमॉड्यूल्स और
युक्त कमिट में निर्दिष्ट की गई जाँच करें
भंडार। यह जब तक सबमॉड्यूल्स HEAD को अलग नहीं कर देगा
--rebase या --merge निर्दिष्ट या प्रमुख सबमॉड्यूल है। $ name.update
को रिबेस या मर्ज करने के लिए सेट किया गया है।

इसे चलाएं और सब कुछ ठीक होना चाहिए:

git submodule update

4
किसी तरह, मेरे लिए मुझे जोड़ने की जरूरत थी --init। इसके बिना, सबमॉडल्स एक राज्य में रहेंगे (new commits)। हालांकि मेरे सबमॉड्यूल पहले से ही आरंभिक थे।
अंबाइडेक्स

--initइस सब में @Ambidex हाँ विकल्प महत्वपूर्ण है। जब से मेरे सबमॉडल्स को https पर क्लोन किया गया था तब से मुझे उपयोगकर्ता नाम और पासवर्ड के लिए प्रेरित किया जा रहा था। मैं दोनों फ़ोल्डर में गया और sshचेकआउट के लिए प्रोटोकॉल का उपयोग करने के लिए रीमोट सेट किया ।
ए-डब

1
काम नहीं करता है अगर सबमॉड्यूल कमिट हैश संशोधित और अस्थिर है
आदिवासी

जोड़ सकते हैं - ताकि आप सभी
सबमॉडल्स

21

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

या, यदि आप चाहते हैं कि उप-संस्करण संस्करण में शीर्ष रेपो बिंदुओं पर हो, तो करें git submodule update --recursive--initयदि आपने अभी क्लोन किया है तो जोड़ें ।

इसके अलावा, git submoduleएक सबमॉड्यूल कमांड के बिना आपको दिखाएगा कि आप किस ओर इशारा कर रहे हैं। यदि यह सिंक में नहीं है, तो कमिट के सामने a या + होगा।

यदि आप इसमें एक सबमोडुले के साथ एक पेड़ को देखते हैं, तो आप देख सकते हैं कि सबमॉडल को commitबाकी के विपरीत के रूप में चिह्नित किया गया है जो कि बूँद या पेड़ हैं।

यह देखने के लिए कि आपके द्वारा किए जा सकने वाले सबमॉड्यूल के लिए एक विशेष प्रतिबद्ध बिंदु क्या है:

git ls-tree <some sha1, or branch, etc> Submodule/path

फिर आप कमिट या कुछ और देख सकते हैं यदि आप उस लॉग को पास करके पसंद करते हैं, आदि ( git-dirgit कमांड स्तर पर विकल्प आपको सबमॉड्यूल के नीचे cd करने के लिए छोड़ देता है):

git --git-dir=Submodule/path log -1 $(<the above statement>)

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

6

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

जनक में:

git reset --hard

git submodule update

सबमोडुले में:

git reset --hard

5

का प्रयोग करें git ls-tree HEAD"superproject" फ़ोल्डर में क्या करने के लिए अपने submodule पर मूल रूप से था देखने के लिए। फिर सबमॉड्यूल निर्देशिका में बदलें और git log --oneline --decorateयह देखने के लिए उपयोग करें कि मूल प्रतिबद्धता किस शाखा पर है। आखिरकार,git checkout original-commit-branch

कुछ परीक्षण निर्देशिकाओं का उपयोग करते हुए, मैं यहां बता सकता हूं कि आदेश क्या दिख सकते हैं:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"सुपरप्रोजेक्ट" में sm2 सबमॉडल को दर्शाता है f68bed6लेकिन sm2 में यह HEAD है 5b8d48f। सबमॉड्यूल कमेटी f68bed6की तीन शाखाएँ होती हैं जिनका उपयोग सबमॉड्यूल डायरेक्टरी में चेकआउट के लिए किया जा सकता है।


धन्यवाद दान, सही!
एलेक

3

यहाँ जवाब किसी भी तरह से सबमॉड्यूल के साथ मेरे विशिष्ट मुद्दे को हल नहीं करता है इसलिए यदि यह आपके साथ भी होता है, तो निम्नलिखित प्रयास करें ...

 git submodule foreach git reset --hard

https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/


1
अच्छा वन-लाइनर!
user8162

1

मैं सबमॉड्यूल में और मेरे मॉड्यूल में भी किसी भी परिवर्तन की अवहेलना करना चाहता था

नीचे दिए गए आदेश ने मेरी मदद की:

git submodule update --init --recursive
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.