Git सबमॉड्यूल नए कमिट दिखाता है, submodule स्टेटस कहता है कि कुछ भी नहीं करना है


47

Git रिपॉजिटरी में, मैंने एक github रिपॉजिटरी को संदर्भित करने के लिए अपनी .gitmodules फ़ाइल स्थापित की है:

[submodule "src/repo"]
    path = src/repo
    url = repourl

जब मैं इस रेपो पर 'git स्टेटस' दिखाता हूं, यह दिखाता है:

On branch master
Your branch is up-to-date with 'origin/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:   src/repo (new commits)

यदि मैं रेपो पर src / repo और git स्टेटस में cd करता हूं, तो यह कहता है कि कमिट करने के लिए कुछ नहीं है।

मेरे शीर्ष-स्तरीय गिट रेपो की शिकायत क्यों है?

जवाबों:


42

ऐसा इसलिए है क्योंकि Git रिकॉर्ड जो प्रतिबद्ध है (शाखा या टैग नहीं, SHA-1 हैश में दर्शाए गए एक कमिट) को प्रत्येक सबमॉड्यूल के लिए चेक किया जाना चाहिए। यदि आप सबमॉड्यूल डायर में कुछ बदलते हैं, तो गिट इसका पता लगाएगा और आपसे आग्रह करेगा कि आप शीर्ष स्तर की लाइब्रेरी में उन बदलावों के लिए प्रतिबद्ध हों।

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

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

अन्यथा यह -dirtyहैश परिवर्तन दिखाता है जिसे आप शीर्ष-स्तरीय भंडार में चरणबद्ध या प्रतिबद्ध नहीं कर सकते हैं। git statusयह भी दावा करता है कि सबमॉड्यूल में अनट्रैक / संशोधित सामग्री है।

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ 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)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

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

git add src/repo

1
क्या होगा अगर मैं मुख्य रेपो में कोई कमिट नहीं जोड़ना चाहता? मेरा उपयोग मामला है - मेरे पास एक मुख्य भंडार है, फिर मेरे पास इसकी विकी है जो एक भंडार भी है (जैसा कि गिटहब और बिटबकेट में उपलब्ध है)। अब मैंने wikiएक डायरेक्टरी विकी में सबमॉडल के रूप में जोड़ा है । मैं नहीं चाहता कि मेरे wiki(/ विकि निर्देशिका) में से कोई भी बदलाव मेरे मुख्य / कोड रिपॉजिटरी में प्रतिबिंबित हो। क्या मुझे अपने मुख्य भंडार में .gitmodules पथ जोड़ना चाहिए .gitignore? मुझे इसे किस प्रकार करना चाहिए?
yadav_vi

14
मेरे मामले में मुझे जो कुछ भी करने की ज़रूरत थी, वह मुख्य रेपो से ही सबमॉड्यूल को अपडेट करना था। कुछ इस तरह:git submodule update src/repo
अगस्टिन अमेनाबर 13

19

मैं सिर्फ समस्या के इसी वर्ग में भाग गया, और मैं स्वीकृत उत्तर के टिप्पणी अनुभाग में @AugustinAmenabar द्वारा प्रस्तुत समाधान का उपयोग करने में सक्षम था । मेरा सेटअप थोड़ा अधिक जटिल था, इसलिए मैंने --recursiveसभी निर्भरताओं को अद्यतित करने के लिए ध्वज जोड़ा ।

git submodule update src/repo --recursive

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