Git सबमॉडल के रूप में कॉमन कोड जोड़ने के साथ समस्या: "पहले से ही सूचकांक में मौजूद है"


225

मैं git के लिए नया हूं और सबमॉड्यूल जोड़ने में मदद करूंगा। मुझे कुछ कॉमन कोड साझा करने वाले दो प्रोजेक्ट मिले हैं। साझा कोड को केवल दो परियोजनाओं में कॉपी किया गया था। मैंने कॉमन कोड के लिए एक अलग git रेपो बनाया और इसे git सबमॉड्यूल के रूप में जोड़ने की योजना के साथ इसे प्रोजेक्ट्स से हटा दिया।

मैंने फ़ोल्डर को निर्दिष्ट करने के लिए गिट सबमॉडल ऐड के पथ विकल्प का उपयोग किया:

git submodule add url_to_repo projectfolder

लेकिन फिर त्रुटि हुई:

'projectfolder' already exists in the index"

यह मेरी रिपॉजिटरी की वांछित संरचना है:

repo
|-- projectfolder
    |-- folder with common code

रेपो में या सीधे एक नए फ़ोल्डर में गिट सबमॉड्यूल को जोड़ना संभव है, लेकिन प्रोजेक्टफ़ोल्डर में नहीं। समस्या यह है कि यह वास्तव में प्रोजेक्टफ़ोल्डर में होने की आवश्यकता है .. मैं इसके बारे में क्या कर सकता हूं और मुझे गिट सबमॉड्यूल ऐड के पथ विकल्प के बारे में क्या गलतफहमी हुई है?


यदि आप करते हैं तो आपको क्या मिलेगा git ls-files --stage projectfolder?
मार्क लॉन्गेयर

मैं 100644. के साथ सभी सामग्री शुरुआती के साथ एक सूची प्राप्त
वन्जा

संबं धत
लं क

8
मेरे git rmलिए मौजूदा फ़ोल्डर में मदद करने पर: |
रोज़गारपैक

जवाबों:


343

मुझे डर है कि आपके प्रश्न में पर्याप्त जानकारी नहीं है कि क्या चल रहा है, क्योंकि आपने मेरे अनुवर्ती प्रश्न का उत्तर नहीं दिया है, लेकिन यह किसी भी मामले में मददगार हो सकता है।

उस त्रुटि का मतलब है कि projectfolderपहले से ही मंचित है ("सूचकांक में पहले से मौजूद है")। यह जानने के लिए कि यहाँ क्या हो रहा है, उस फ़ोल्डर के अंतर्गत इंडेक्स में सब कुछ सूचीबद्ध करने का प्रयास करें:

git ls-files --stage projectfolder

उस आउटपुट का पहला कॉलम आपको बताएगा कि सूचकांक में किस प्रकार की वस्तु है projectfolder। (ये यूनिक्स फिल्म्स की तरह दिखते हैं, लेकिन गिट में विशेष अर्थ हैं।)

मुझे संदेह है कि आप कुछ इस तरह देखेंगे:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(यानी के साथ शुरू होने वाली एक पंक्ति 160000), जिस स्थिति में रिपोजिटरी projectfolderको पहले से ही "गिटलिंक" के रूप में जोड़ा गया है। यदि यह के आउटपुट में प्रकट नहीं होता है git submodule, और आप इसे सबमॉड्यूल के रूप में फिर से जोड़ना चाहते हैं, तो आप ऐसा कर सकते हैं:

git rm --cached projectfolder

... इसे अस्थिर करने के लिए, और फिर:

git submodule add url_to_repo projectfolder

... रिपॉजिटरी को एक सबमॉड्यूल के रूप में जोड़ना।

हालाँकि, यह भी संभव है कि आप सूचीबद्ध कई ब्लॉब्स देखेंगे (फ़ाइल मोड के साथ) 100644100755 ) और , जो मुझे सुझाव देंगे कि आपने projectfolderनई रिपॉजिटरी को जगह में कॉपी करने से पहले फ़ाइलों को ठीक से अनस्टेज नहीं किया है। अगर ऐसा है, तो आप उन सभी फ़ाइलों को अनस्टेज करने के लिए निम्न कार्य कर सकते हैं:

git rm -r --cached projectfolder

... और उसके बाद सबमॉड्यूल जोड़ें:

git submodule add url_to_repo projectfolder

12
आपके विस्तृत उत्तर के लिए धन्यवाद मार्क। मैंने "git rm -r --cached projectfolder" किया और फिर से सबमॉड्यूल को अटेस्ट करने की कोशिश की। हालाँकि, इस बार मुझे त्रुटि rmessage "'प्रोजेक्टफॉल्डर' पहले से मौजूद है और यह मान्य git रेपो नहीं है"।
वनजा

3
@Vanja: यह इंगित करता है कि projectfolderएक .gitनिर्देशिका नहीं थी । यह आपके प्रश्न से लग रहा था जैसे कि आपने projectfolderकहीं और के लिए नया भंडार बनाया है, और इसे जगह में कॉपी किया है, लेकिन स्पष्ट रूप से ऐसा नहीं था। आपको मौजूदा projectfolderरास्ते से हटने की आवश्यकता होगी , और फिर .gitसबमॉड्यूल के रूप में जोड़ने से पहले नई रिपॉजिटरी (इसकी निर्देशिका के साथ पूर्ण ) को कॉपी करें । या, यदि आपने पहले से ही प्रतिनिधित्व करने वाले रिपॉजिटरी में धकेल दिया है, तो आप रास्ते से हट url_to_repoसकते हैं projectfolderऔर फिर उस URL से सबमॉड्यूल जोड़ सकते हैं।
मार्क लोंगेयर

भयानक जवाब +1 सभी तरह
abbood

इससे मुझे एक टन की मदद मिली। धन्यवाद!
इवान मोरन

1
यह वही है जो मैंने किया है, जो 3 चरण प्रक्रिया STEP 1 है: git rm -r --cached src / test / resource /, STEP 2: मौजूदा संसाधन निर्देशिका को किसी अन्य स्थान पर हटा दिया, STEP 3: git सबमॉडल url_to_repo src / परीक्षण / संसाधन
विक्रमवी

52

मैन्युअल रूप से सबमॉड्यूल हटाने से चरणों की संख्या शामिल होती है और यह मेरे लिए काम करता है।

मान लें कि आप प्रोजेक्ट रूट डायरेक्टरी में हैं और सैंपल गिट मॉड्यूल का नाम "c3-pro-ios- फ्रेमवर्क" है

सबमॉड्यूल से जुड़ी फाइलों को हटा दें

rm -rf .git/modules/c3-pro-ios-framework/

कॉन्फ़िगरेशन में सबमॉड्यूल के किसी भी संदर्भ को निकालें

vim .git/config

यहां छवि विवरण दर्ज करें

.Itmodules निकालें

rm -rf .gitmodules

इसे "गिट" के बिना कैश से निकालें

git rm --cached c3-pro-ios-framework

सबमॉड्यूल जोड़ें

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
बढ़िया पोस्ट, बढ़िया काम करता है। आप सभी को इसे साझा करने के लिए बहुत बहुत, सर। वास्तव में महान।
गबन g

1
मैंने git submoduleहटाने के बाद और जोड़ने से पहले के माध्यम से सबमॉड्यूल्स को सूचीबद्ध करने की कोशिश की और इसने मुझे एक त्रुटि दी, निष्कासन को ध्यान में रखा।
मेहमेट

1
अगर मैं कर सकता तो मैं इस 50x को बढ़ा देता; आपने मेरा दिन बचा लिया!
सेंसि जेम्स

touch .gitmodules(काम के पेड़ में होने की जरूरत है, इसलिए इसे हटाने से मदद मिलती है। लेकिन आपको इसे फिर से जोड़ने की जरूरत है)। बहुत बढ़िया पोस्ट btw। केवल एक चीज जो यहां काम करती है।
Torxed

यह .gitनिर्देशिका थी जो अभी भी मेरे लिए अवशेष थी। यह बहुत अच्छा काम किया। धन्यवाद।
केविन एंडरसन

44

आपको सबसे पहले अपने सबमॉड्यूल गिट रिपॉजिटरी (इस मामले में प्रॉजेक्ट फोल्डर) को हटाने की जरूरत है।

rm -rf projectfolder

git rm -r projectfolder

और फिर सबमॉड्यूल जोड़ें

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>मेरे लिए एक ही
सबमॉड्यूल

1
धन्यवाद!! मुझे प्रोजेक्ट फ़ोल्डर में जोड़ना नहीं था, मैं बस वहां से उपनिर्देशिका और क्लोन में बदल गया।
टोनी फ्रेजर

32

मुझे भी यही समस्या थी और देखने के घंटों बाद जवाब मिला।

जो त्रुटि मुझे मिल रही थी वह थोड़ी अलग थी: <path> already exists and is not a valid git repo(और एसईओ मूल्य के लिए यहां जोड़ा गया)

समाधान निर्देशिका बनाने के लिए नहीं है जो सबमॉड्यूल का निर्माण करेगा। निर्देशिका को git submodule addकमांड के भाग के रूप में बनाया जाएगा ।

साथ ही, तर्क आपके माता-पिता-रेपो रूट के सापेक्ष होने की उम्मीद करता है, न कि आपकी कार्यशील निर्देशिका के लिए, इसलिए उस पर ध्यान दें।

उपरोक्त उदाहरण के लिए समाधान:

  1. यह ठीक है कि आपके माता-पिता रेपो को पहले ही क्लोन कर चुके हैं।
  2. सुनिश्चित करें कि common_codeनिर्देशिका मौजूद नहीं है।
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( आवश्यक ट्रेलिंग स्लैश पर ध्यान दें। )
  5. सन्यास बहाल किया।

मुझे उम्मीद है कि यह किसी की मदद करता है, क्योंकि इस बारे में कहीं और बहुत कम जानकारी मिल सकती है।


1
चरण 4 शुरू होना चाहिए git submodule add, और अनुगामी स्लेश की आवश्यकता नहीं है।
nullability

टाइपो को ठीक किया। मैंने इसे रिटायर कर दिया है, और अनुगामी स्लेश ने मेरे लिए एक अंतर बना दिया है। मैं zsh का उपयोग कर रहा हूँ अगर इसका कोई प्रभाव हो।
अपरिभाषित

इसने मेरी समस्या को हल कर दिया (ऐड सबमॉडल कमांड के साथ डायरेक्टरी बनाते हुए), धन्यवाद!
जैकजियो

18

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

@ Ujjwal-singh द्वारा अपडेट किया गया:

प्रतिबद्ध होने की जरूरत नहीं है, मंचन पर्याप्त है .. git add/git rm -r


कमिटिंग वही थी जो मुझे याद आती थी। संक्षिप्त उत्तर, लेकिन सही एक!
Qqwy

3
प्रतिबद्ध होने की जरूरत नहीं है, मंचन पर्याप्त है .. git add/gir rm -r
उज्जवल सिंह

3

मानव भाषा में स्पष्ट करने के लिए कि आपको क्या बताने की कोशिश की जा रही है:

आप इस फ़ोल्डर में एक रिपॉजिटरी नहीं बना सकते हैं जो पहले से ही मुख्य रिपॉजिटरी में ट्रैक है।

उदाहरण के लिए: आपके पास एक थीम फ़ोल्डर है जिसे AwesomeThemeयह एक समर्पित रिपॉजिटरी कहा जाता है, आप इसे सीधे अपने मुख्य रिपॉजिटरी में डंप करने की कोशिश करते हैं git submodule add sites/themesऔर आप इसे पसंद करते हैं "AwesomeTheme" index already exists

आपको बस यह सुनिश्चित करने की आवश्यकता है कि पहले से ही sites/themes/AwesomeThemeमुख्य रिपॉजिटरी के संस्करण पर नज़र रखने में नहीं है ताकि सबमॉड्यूल वहां बनाया जा सके।

तो ठीक करने के लिए, अपने मुख्य भंडार में यदि आपके पास एक खाली sites/theme/AwesomeThemeनिर्देशिका है तो उसे हटा दें। यदि आपने पहले ही sites/theme/AwesomeThemeअपनी मुख्य रिपॉजिटरी में डायरेक्टरी के साथ काम कर लिया है, तो आपको इस तरह से एक कमांड के साथ इसके सभी इतिहास को शुद्ध करने की आवश्यकता है:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

अब आप दौड़ सकते हैं git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

चूंकि मुख्य रिपॉजिटरी ने पहले कभी कुछ (उर्फ इंडेक्स) नहीं देखा है sites/themes/AwesomeTheme, इसलिए अब इसे बना सकते हैं।


1

मैंने इसे दूसरी तरह से काम करके इसे प्राप्त किया। एक खाली रेपो से शुरू करते हुए, "प्रोजेक्टफॉल्डर / कॉमन_कोड" नामक एक नए फ़ोल्डर में सबमॉड्यूल जोड़ते हैं। उसके बाद प्रोजेक्टफ़ोल्डर में प्रोजेक्ट कोड जोड़ना संभव हो गया। विवरण नीचे दिखाया गया है।

एक खाली रेपो प्रकार में:

git submodule add url_to_repo projectfolder/common_code

वह वांछित फ़ोल्डर संरचना बनाएगा:

repo
|-- projectfolder
    |-- common_code

अब अधिक सबमॉड्यूल जोड़ना संभव है, और प्रोजेक्ट कोड को प्रोजेक्टफ़ोल्डर में जोड़ा जा सकता है।

मैं अभी तक यह नहीं कह सकता कि इसने इस तरह से काम किया और दूसरे ने नहीं।


0

पता नहीं कि यह कोई उपयोगी है, हालांकि मुझे IntelliJ 15 के भीतर से अपनी फ़ाइलों को कमिट करने की कोशिश करते समय एक ही समस्या थी। अंत में, मैंने SourceTree को खोला और वहाँ मैं बस फाइल कर सकता था। समस्या सुलझ गयी। कोई फैंसी git कमांड जारी करने की आवश्यकता नहीं है। अगर किसी के पास एक ही मुद्दा है तो बस इसका उल्लेख करना।


0

रिपॉजिटरी फोल्डर में जाएं। .Itmodules से प्रासंगिक सबमॉड्यूल हटाएं। छुपी हुई फ़ाइलों का चयन करें। .गित फ़ोल्डर पर जाएं, मॉड्यूल फ़ोल्डर और कॉन्फ़िगरेशन से सबमॉड्यूल्स को हटा दें।


0

यह तब होता है यदि। टॉगल फ़ाइल लक्ष्य पथ में गुम है। मेरे द्वारा निष्पादित किए जाने के बाद यह मुझे खुशी देता है git clean -f -d

मुझे मैसेज में दिख रहे सभी टार्गेट फोल्डर को डिलीट करना था और फिर एक्जीक्यूट करना था git submodule update --remote


-18

आपके git dir में, मान लीजिए कि आपने सभी परिवर्तनों को सिंक कर दिया है।

rm -rf .git 

rm -rf .gitmodules

फिर करो:

git init
git submodule add url_to_repo projectfolder

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