गिट भिन्न का कहना है कि सबप्रोजेक्ट गंदा है


227

मैंने अभी-अभी एक git diff चलाया है, और मुझे अपने सभी लगभग 10 सबमॉडल्स के लिए निम्न आउटपुट मिल रहा है

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

इसका क्या मतलब है? मैं इसे कैसे ठीक करूं?

जवाबों:


268

जैसा कि मार्क लॉन्गेयर के ब्लॉग पोस्ट Git Submodules में बताया गया है ,

संस्करण 1.7.0 और बाद में git में git सबमॉड्यूल के व्यवहार में एक कष्टप्रद परिवर्तन होता है।
सबमोड्यूल्स को अब गंदा माना जाता है यदि उनके पास कोई संशोधित फाइल या अनटैक की गई फाइलें हैं , जबकि पहले यह केवल मामला होगा यदि सबमॉड्यूल में HEAD गलत प्रतिबद्ध की ओर इशारा करता है।

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

आप इसे ठीक कर सकते हैं:

  • माता-पिता रेपो (जहां अब "गंदी" फ़ाइलों की रिपोर्ट नहीं करनी चाहिए) में वापस जाने से पहले, अपने प्रत्येक सबमॉड्यूल के भीतर परिवर्तन / विकास को कम या कम करना। अपने सबमॉडल में सभी परिवर्तनों को पूर्ववत करने के लिए अपने सबमॉडल cdकी रूट डायरेक्टरी में करें और करेंgit checkout .

    dotnetCarpenter टिप्पणियाँ जो आप कर सकते हैं:git submodule foreach --recursive git checkout .

  • या अस्थायी रूप से उन "गंदे" सबमॉड्यूल को अनदेखा करने के --ignore-submodulesलिए अपने में जोड़ें git diff

Git संस्करण 1.7.2 में नया

के रूप में नोम नीचे टिप्पणी , इस सवाल का उल्लेख है कि, Git संस्करण 1.7.2 के बाद से, आप के साथ गंदा submodules अनदेखा कर सकते हैं:

git status --ignore-submodules=dirty

2
यह भी जानने के लिए एक अच्छी बात है: आप अभी भी git commit -aइन परिवर्तनों को जोड़ने की चिंता किए बिना निष्पादित कर सकते हैं। हालाँकि वे Mसामने वाले के साथ चिह्नित हैं , वे आपकी प्रतिबद्धता में समाप्त नहीं होंगे।
गीताकार

1
मेरे लिए, मुझे प्रत्येक गंदे पनडुब्बी में जाना था और दौड़ना था git clean -id
GDP2

1
@ जीडीपी 2 जिसे आप एक पंक्ति में दान कर सकते हैं, git submodule foreach --recursive git clean -id(पहले बैकअप रेपो में परीक्षण किया जा सकता है?))
VONC

1
जिस मामले को मैं बेवजह देख रहा था, क्या हो रहा था कि मेरे पास ऐसी फाइलें नहीं थीं जो सबमॉड्यूल में नहीं थीं .gitignore। उन्हें वहां जोड़ना या मेरी वैश्विक अनदेखी सूची में तय चीजों को शामिल करना।
बेन

21

इसके अलावा submodule को हटाने और फिर चल git submodule initऔर git submodule updateस्पष्ट रूप से चाल करना होगा, लेकिन हमेशा उचित या संभव नहीं हो सकता।


1
यह मेरे लिए तब काम आया जब मैंने कुछ मौजूदा फ़ोल्डरों को सबमॉड्यूल में बदल दिया और फिर दूसरी मशीन पर खींचा, जिसमें अभी भी पुराने फोल्डर थे।
रोजर लिप्सकॉम्ब

18

किसी भी सबमॉड्यूल की सभी अनट्रेक्ड फ़ाइलों को अनदेखा करने के लिए, उन परिवर्तनों को अनदेखा करने के लिए निम्न कमांड का उपयोग करें।

git config --global diff.ignoreSubmodules dirty

यह आपके स्थानीय गिट विन्यास के लिए निम्नलिखित विन्यास विकल्प जोड़ देगा:

[diff]
  ignoreSubmodules = dirty

अधिक जानकारी यहाँ से प्राप्त की जा सकती है


16

संपादित करें : यह उत्तर (और अन्य अधिकांश) अप्रचलित हैं; इसके बजाय देवपुल का उत्तर देखें ।


मूल रूप से, वैश्विक डिफ़ॉल्ट (लेकिन कमांड पर git डिफ़ॉल्ट झंडे स्थापित करना भी देखें ) " git diff --ignore-submodules" और " git status --ignore-submodules" बनाने के लिए कोई विन्यास विकल्प नहीं थे । एक वैकल्पिक एक डिफ़ॉल्ट सेट करने के लिए है प्रत्येक व्यक्ति submodule आप (दोनों के लिए अनदेखा करना चाहते पर config विकल्प और ), या तो में फ़ाइल (स्थानीय केवल) या (Git द्वारा संस्करणीकृत किया जाएगा)। उदाहरण के लिए:ignoregit diffgit status.git/config.gitmodules

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untrackedसिर्फ अनट्रैक की गई फ़ाइलों को अनदेखा करने के लिए ignore = dirty, संशोधित फ़ाइलों ignore = allको अनदेखा करने के लिए , और अनदेखा करने के लिए भी। जाहिरा तौर पर सभी सबमॉड्यूल्स के लिए इसे वाइल्डकार्ड करने का कोई तरीका नहीं है।


13

यह मामला है क्योंकि आपके पास जो सबमॉडल के लिए पॉइंटर है वह वास्तव में सबमॉड्यूल डायरेक्टरी में नहीं है। इसे ठीक करने के लिए, आपको git submodule updateफिर से चलना होगा :


9
git submodule foreach --recursive git checkout .

यह मेरे लिए चाल नहीं चली, लेकिन इसने मुझे फाइलों की एक सूची दी (मेरे मामले में केवल एक) जो कि सबमॉड्यूल में बदल दी गई थी (मेरे बिना वहां कुछ भी करने के बिना)।

इसलिए मैं सबमॉड्यूल और गिट स्टेटस को सौंप सकता हूं, जिससे मुझे पता चला कि मेरा HEAD अलग हो गया था -> गिट चेकआउट मास्टर, git स्टेटस को एक बार फिर से संशोधित फाइल देखने के लिए, git चेकआउट> फ़ाइल नाम <, गिट पुल और सब कुछ फिर से ठीक।


9

मैंने सबमॉड्यूल निर्देशिका को हटा दिया और इसे एक बार फिर से शुरू कर दिया

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
मैं समझ सकता था कि क्या हुआ था, लेकिन यह भी केवल एक चीज थी जो मेरे लिए काम की थी ...
स्माइबॉम्ब

6

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

सबमॉडुले में फिल्ममोड को निष्क्रिय करने के लिए, आप /.it/modules/path/to/your/submodule/config को संपादित और जोड़ सकते हैं

[core]
  filemode = false

यदि आप सभी गंदे राज्यों को अनदेखा करना चाहते हैं, तो आप या तो /.itmodules फ़ाइल ignore = dirtyमें संपत्ति सेट कर सकते हैं , लेकिन मुझे लगता है कि केवल फ़िल्मीकोड को अक्षम करना बेहतर है।


1

मेरे मामले में मुझे यकीन नहीं था कि ऐसा होने का कारण क्या था, लेकिन मुझे पता था कि मैं बस चाहता था कि सबमॉड्यूल्स को उनके नवीनतम रिमोट कमेट पर रीसेट किया जाए और इसके साथ किया जाए। इसमें विभिन्न सवालों के एक जोड़े के जवाब यहां दिए गए हैं:

git submodule update --recursive --remote --init

सूत्रों का कहना है:

मैं git सबमॉड्यूल में अपने परिवर्तन कैसे वापस करूं?

सभी गिट सबमॉडल्स के नवीनतम खींचने का आसान तरीका

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