क्या आप अपने .itignore में एक git सबमॉडल को अनदेखा करते हैं या अपने रेपो में करते हैं?


94

मैंने अपने प्रोजेक्ट में एक सबमॉडल जोड़ा है जिसमें project_dir/vendor/submodule_oneअब हर बार git statusमुझे मिलता है modified: vendor/submodule_one (new commits)

मेरा सवाल यह है कि इससे निपटने का सबसे अच्छा तरीका क्या है? मैं जोड़ सकता हूँ vendor/submodule_oneकरने के लिए अपने -folder .gitignoreमेरी मुख्य परियोजना के रूप में मेरे submodule की बारीकियों के बारे में पता करने की जरूरत नहीं करना चाहिए?

या जब मैं बदल रहा हूं और अपने सबमॉड्यूल में बदलाव कर रहा हूं, तो क्या मुझे अपने मुख्य प्रोजेक्ट में भी कमिट करने की जरूरत है?

बस सबमॉडल्स के साथ शुरुआत करना और उन्हें स्थापित करने से परे बहुत अधिक जानकारी नहीं मिल सकती है।

जवाबों:


81

नहीं, आपको अपने सबमॉड्यूल को अपने साथ जोड़ने की जरूरत नहीं है .gitignore: आपके सबमॉडल से माता-पिता जो देखेंगे, वह एक गीटलिंक (एक विशेष प्रविष्टिmode 160000 ) है।

इसका मतलब है कि: किसी सबमॉडल में सीधे किए गए किसी भी बदलाव के लिए मूल निर्देशिका में एक कमेटी का पालन करना होगा।
इस तरह, अभिभावक निर्देशिका उप-राज्य की स्थिति के लिए सही प्रतिबद्ध दर्ज करेगी: यह प्रतिबद्ध "gitlink" है जो ऊपर वर्णित है;

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


ध्यान दें कि Git 2.13 (Q2 2017) के साथ, gitlink को अनदेखा नहीं करते हुए , आप अभी भी इसके साथ सबमॉडल को अनदेखा कर सकते हैं:

git config submodule.<name>.active false

" गिट सबमॉडल के लिए नए कामों को अनदेखा करें " पर और देखें ।


नोट: Git 2.15.x / 2.16 (Q1 2018) के साथ, एक सबमॉड्यूल को अनदेखा करना अधिक सटीक है।
" git status --ignored --untracked" एक अलग परियोजना के एक कार्यशील पेड़ पर नहीं रुका, जो केवल एक उपेक्षित निर्देशिका में सूचीबद्ध है और फाइलों को उस अन्य परियोजना में सूचीबद्ध किया गया है, बजाय केवल निर्देशिका को ही अनदेखा करने के रूप में।

देखें प्रतिबद्ध fadb482 (25 अक्टू 2017) से जोहानिस Schindelin ( dscho)
( जूनियो सी gitsterहमानो द्वारा विलय - - in da7996a , 06 नवंबर 2017)

status: बहिष्कृत निर्देशिका में सबमॉडुल्स द्वारा भ्रमित न हों

हम सावधानीपूर्वक excludeध्वज को treat_directory()फ़ंक्शन में पास करते हैं ताकि हम यह संकेत कर सकें कि इसमें फ़ाइलों को पुनर्प्राप्त करने के दौरान अनट्रैक किए जाने के बजाय बाहर रखा गया है।

लेकिन हमने अभी भी सबमॉड्यूल्स का उसी तरह से इलाज नहीं किया है।

इस कारण से, git status --ignored --untrackedएक submodule के साथ submoduleएक gitignored में tracked/"में submodule दिखाते थे Untracked files" खंड, जैसे

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

इसके बजाय, हम चाहते हैं कि यह " Ignored files" सेक्शन में सबमॉड्यूल दिखाए :

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
धन्यवाद VonC, पूर्ण समझ में आता है जब आप इसे उस तरह से रखते हैं।
स्पर्सटाउन

8
यह उत्तर भ्रमित करने वाला है क्योंकि प्रश्न शीर्षक पूछ रहा है कि क्या सबमॉडल फ़ोल्डर्स को अनदेखा करना है या नहीं, और आप प्रश्न के शरीर में बाद में एक अलग प्रश्न के लिए हां के साथ उत्तर दे रहे हैं।
SgtPooki

1
मुझे लगता है कि यह अब और अधिक समझ में आता है, और कुछ बहुत ही उपयोगी जानकारी प्रदान कर रहा है। बहुत बढ़िया, अद्यतन करने के लिए धन्यवाद :)
SgtPooki

.Gitignore के लिए तर्क: क्यों चेक-इन .gitsubmodules फ़ाइल जब उसमें निहित url में संभवतः उपयोगकर्ता नाम के साथ कोई विशिष्ट git url हो सकता है?
djangofan

1
@djangofan प्रश्न (और मेरा उत्तर) सबमॉडल फ़ोल्डर को अनदेखा करने के बारे में था (केवल एक जिंकलिंक का प्रतिनिधित्व करने वाला)। .gitmodulesफ़ाइल को अनदेखा करने के बारे में नहीं । यह सच है कि इस एक फ़ाइल ( .gitmodules) में क्रेडेंशियल्स शामिल हो सकते हैं, लेकिन अगर इनका उपयोग केवल पब्लिक रिपोज को क्लोन करने के लिए किया जाता है, तो इसमें उन्हें शामिल करने की आवश्यकता नहीं है। इसके अलावा, उन्हें विंडोज पर, यहां तक ​​कि "विंडोज के लिए गिट क्रेडेंशियल मैनेजर" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ) जैसे क्रेडेंशियल हेल्पर्स के साथ भी कैश किया जा सकता है । अतः इसमें साख .gitmodulesका होना कोई घातक बात नहीं है।
VonC

8

किसी कारण से submodule.module-name.active ने मेरे लिए काम नहीं किया।

इसलिए मैंने submodule.module-name.ignore का उपयोग किया है

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - यहां आप पैरामीटर के लिए संभावित मानों का विवरण पा सकते हैं

मेरे लिए (नए कमिट) और (संशोधित सामग्री) संदेशों के लिए काम करता है।


1

स्वीकृत उत्तर को जोड़ने के लिए, मैंने पाया है कि .itignore में Git सबमॉड्यूल फ़ोल्डर जोड़ने से वास्तव में समस्याएँ पैदा होती हैं - विशेषकर जब प्रोजेक्ट का एक नया क्लोन बनाने की कोशिश कर रहा हो। विशेष रूप से, सामान्य सबमॉड्यूल क्लोन कमांड चलाने से सबमॉड्यूल फ़ोल्डर खाली हो जाता है:

git submodule init
git submodule update
git pull --recurse-submodules

केवल फिर से चलाने की कोशिश करके

git submodule add <Git repo> <submodule folder>

यह स्पष्ट था कि आउटपुट के आधार पर समस्या क्या थी:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

जोड़ने के बजाय -f, मैंने .itignore से Git सबमॉड्यूल फ़ोल्डर को हटा दिया और सबमॉड्यूल क्लोन कमांड्स को फिर से चलाया - जो अब सफलतापूर्वक फ़ोल्डर बनाया। मुझे लगता है कि इसमें एक बग हो सकता है कि सबमॉड्यूल क्लोन कमांड्स में से एक रिस्पेक्ट .ignignore है, लेकिन यह चेतावनी नहीं देता है कि यह उसी के अनुसार सबमॉड्यूल को छोड़ रहा है।

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