मैं एक सबमॉड्यूल कैसे निकालूं?


3539

मैं एक गिट सबमॉडल कैसे निकालूं?

वैसे, वहाँ एक कारण है कि मैं बस नहीं कर सकता है git submodule rm whatever?


109
सरल उत्तर stackoverflow.com/a/21211232/94687 अब सही है, और इसे चिह्नित किया जाना चाहिए। अब, यह बस है git rm modulenameऔरrm -rf .git/modules/modulename
imz - इवान Zakhryaschev

10
यह वास्तव में सच नहीं है। उस उत्तर से सबमॉडल प्रविष्टि को हटाने का पता नहीं है .git/config। स्वीकृत उत्तर पूरी तरह से एए सबमॉड्यूल को हटाने के लिए अप-टू-डेट का रास्ता दिखाता है। यह इस उत्तर में भी अधिक स्पष्ट रूप से समझाया गया है: stackoverflow.com/a/36593218/1562138
fvgs

मुझे यह लेख submodules को हटाने में बहुत मददगार लगा। इसमें .gitsubmodules और .git / config फाइल लिंक
Ri_

12
कृपया अपने आप को कुछ समय बचाएं और सीधे उस उत्तर पर जाएं जो काम करता है (2017 में): stackoverflow.com/a/36593218/528313
विन्सेन्ज़ो पीआई

मैंने दो दिनों के लिए सबमॉडल की समस्याओं का सामना किया है। सफलता तब मिली जब मुझे यह पता चला: forum.developer.apple.com/thread/13102 । मूल रूप से, Xcode, और शायद अन्य ऐप्स, url वाले '~' का विस्तार करने के लिए संघर्ष करते हैं। एक बार जब मैंने ssh बदल दिया: //username@server.remoteHost.com/~/git/MyRepo.git to ssh: //username@server.remoteHost.com/home/username/git/MRRepo.git (वास्तविक पथ देखें) अपने सर्वर पर), दस मिनट के साथ सभी विचित्रता गायब हो गई। यह भी देखें stackoverflow.com/questions/32833100/...
एलिस वैन Looij

जवाबों:


2213

चूंकि git1.8.3 (22 अप्रैल, 2013) :

"मैं अब इस सबमॉड्यूल में दिलचस्पी नहीं रखता" कहने का कोई पोर्सिलेन तरीका नहीं था, एक बार जब आप " submodule init" के साथ एक सबमॉड्यूल में अपनी रुचि व्यक्त करते हैं ।
" submodule deinit" ऐसा करने का तरीका है।

हटाने की प्रक्रिया भी git rm(git1.8.5 अक्टूबर 2013 के बाद से) का उपयोग करती है।

सारांश

3-चरणों को हटाने की प्रक्रिया तब होगी:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

व्याख्या

rm -rf: इसका उल्लेख डैनियल श्रोएडर के उत्तर में किया गया है , और टिप्पणी में एओनील द्वारा संक्षेप में प्रस्तुत किया गया है :

यह .git/modules/<path-to-submodule>/अपरिवर्तित छोड़ देता है ।
इसलिए यदि आप एक बार इस विधि के साथ एक सबमॉड्यूल को हटा देते हैं और उन्हें फिर से जोड़ते हैं, तो यह संभव नहीं होगा क्योंकि रिपॉजिटरी पहले से ही भ्रष्ट है।


git rm: देखें 95c16418 प्रतिबद्ध :

वर्तमान में git rmएक सबमॉड्यूल पर " " का उपयोग करने से सबमॉड्यूल के काम के पेड़ को सुपरप्रोजेक्ट से हटा दिया जाता है और इंडेक्स से गिटलिंक को हटा दिया जाता है।
लेकिन सबमॉड्यूल का सेक्शन .gitmodulesअछूता रह गया है, जो अब हटाए गए सबमॉड्यूल का एक लेओवर है और उपयोगकर्ताओं को परेशान कर सकता है (सेटिंग में विरोध के रूप में .git/config, यह एक अनुस्मारक के रूप में रहना चाहिए कि उपयोगकर्ता ने इस सबमॉड्यूल में रुचि दिखाई है, इसलिए इसे बाद में फिर से खोल दिया जाएगा। जब एक पुरानी प्रतिबद्धता की जाँच की जाती है)।

" git rm" उपयोगकर्ता को न केवल काम के पेड़ से सबमॉड्यूल हटाने से मदद करें, बल्कि फ़ाइल submodule.<submodule name>से " " अनुभाग को हटाकर .gitmodulesदोनों को चरणबद्ध करें।


git submodule deinit: यह इस पैच से उपजा है :

" git submodule init" के साथ उपयोगकर्ता यह बताने में सक्षम है कि वे एक या एक से अधिक सबमॉड्यूल की परवाह करते हैं और यह चाहते हैं कि अगली कॉल पर वह " git submodule update" के लिए आबाद हो जाए ।
लेकिन वर्तमान में कोई आसान तरीका नहीं है कि वे बता सकें कि वे अब एक सबमॉड्यूल की परवाह नहीं करते हैं और स्थानीय काम के पेड़ से छुटकारा पाना चाहते हैं (जब तक कि उपयोगकर्ता सबमॉडल इंटर्नल के बारे में बहुत कुछ नहीं जानता है और काम के साथ " submodule.$name.url" सेटिंग को हटा देता है। .git/configवृक्ष स्वयं)।

' deinit' कमांड प्रदान करके उन उपयोगकर्ताओं की मदद करें ।
यह दिए गए सबमॉड्यूल (ओं) के लिए या (उन सभी के लिए, जो ' ' दिया गया है, यदि आरंभिकीकृत किया गया है ) के लिए पूरे submodule.<name>खंड को हटा देता है.git/config.
जब तक कि वर्तमान कार्य वृक्ष में संशोधन न हो, तब तक विफल रहें।
कमांड लाइन पर दिए गए सबमॉड्यूल के लिए शिकायत करें जब यूआरएल सेटिंग में नहीं मिल सकता है .git/config, लेकिन फिर भी असफल नहीं होता है।

यह ध्यान रखता है यदि (डी) आरंभीकरण के चरण ( .git/configऔर .git/modules/xxx)

Git1.8.5 के बाद से, git rmलेता भी की परवाह:

  • ' add' स्टेप जो .gitmodulesफाइल में एक सबमॉडल के url को रिकॉर्ड करता है : इसे आपके लिए निकालने की जरूरत है।
  • सबमॉड्यूल विशेष प्रविष्टि (जैसा कि इस प्रश्न द्वारा सचित्र है ): git rm इसे इंडेक्स से हटाता है:
    git rm --cached path_to_submodule(कोई अनुगामी स्लैश)
    जो उस निर्देशिका को एक विशेष मोड "160000" के साथ इंडेक्स में संग्रहीत करता है, इसे सबमॉडल रूट निर्देशिका के रूप में चिह्नित करता है। ।

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

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

नोट: Git 2.17 (Q2 2018) के बाद से, git सबमॉड्यूल डिनिट अब एक शेल स्क्रिप्ट नहीं है।
यह C फ़ंक्शन के लिए एक कॉल है।

प्रथमेश चव्हाण ( ) द्वारा 2e61273 , 1342476 (14 जनवरी 2018) प्रतिबद्ध देखें । ( जूनियो सी हमानो द्वारा विलय - - में ead8dbe , 13 फरवरी 2018)pratham-pc
gitster

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

18
क्या आप उपयोग के लिए उदाहरण दे सकते हैं submodule deinit?
zakdances

5
@yourfriendzak यहां किसी का सफलतापूर्वक उपयोग करने का एक उदाहरण है: stackoverflow.com/a/16161950/6309 । लेकिन ध्यान रखें कि, जो मैं मूल रूप से विश्वास करता था, उसके विपरीत, 1.8.3 अभी तक जारी नहीं हुआ है! यूनिक्स पर, आप इसे स्रोतों से संकलित कर सकते हैं।
VonC

2
@ HamishDowner विशेष प्रविष्टि को छोड़ दिया जाना चाहिए (निर्देशिका अब एक सबमॉड्यूल नहीं है), और .gitmodulesठीक होना चाहिए, लेकिन मैं अभी भी .gitनिर्देशिका (यानी स्थानीय कॉन्फ़िगरेशन, आपके स्थानीय रेपो के भीतर) के साथ कुछ भी जांच करूंगा : यह नहीं है एक के द्वारा संशोधित git pull)
VonC

2
@ जाइये हाँ, यदि आप .gitmodulesप्रविष्टि को हटाने और सूचकांक में विशेष प्रविष्टि को हटाने के लिए प्रतिबद्ध हैं , और उस रेपो को धक्का देते हैं, तो अन्य इसे खींच सकते हैं और यह सबमॉडल चला जाएगा।
VonC

3
वर्तमान git (v1.9 +) में, सादे पुराना git rm submoduleवही करता है जो आप चाहते हैं जैसा कि अन्य लोग पहले ही कह चुके हैं।
पीट पीटरसन

3445

पृष्ठ Git सबमॉड्यूल ट्यूटोरियल के माध्यम से :

एक सबमॉडल को निकालने के लिए आपको निम्न की आवश्यकता है:

  1. .gitmodulesफ़ाइल से संबंधित अनुभाग हटाएं ।
  2. .gitmodulesपरिवर्तनों को चरणबद्ध करें :
    git add .gitmodules
  3. से संबंधित अनुभाग हटाएं .git/config
  4. काम कर रहे पेड़ और सूचकांक से सबमॉड्यूल फ़ाइलों को निकालें:
    git rm --cached path_to_submodule(कोई अनुगामी स्लैश)।
  5. सबमॉड्यूल की .gitनिर्देशिका निकालें :
    rm -rf .git/modules/path_to_submodule
  6. परिवर्तन करें:
    git commit -m "Removed submodule <name>"
  7. अब अनुपलब्ध सबमॉड्यूल फ़ाइलों को हटाएं:
    rm -rf path_to_submodule

यह भी देखें : नीचे वैकल्पिक कदम


410
"और वैसे, वहाँ एक कारण है कि मैं बस सबमोडुएल आरएम जो भी नहीं कर सकता हूँ?" ?
19ern में

48
@abernier एक करंट उत्तर "हो सकता है क्योंकि ऐसा कोई आदेश मौजूद नहीं है।" मेरा अनुमान है कि वे आकस्मिक डेटा हानि से बचने के लिए सबमॉड्यूल फ़ाइल बनाम सबमॉड्यूल कॉन्फ़िगरेशन को हटाने की कोशिश कर रहे हैं। शायद एक व्यक्ति सोचता होगा कि git submodule rmबस सबमॉड्यूल पंजीकरण को हटा देता है, और अगर कमांड ने स्थानीय रिपॉजिटरी को भी हटा दिया तो आश्चर्य होगा। कोई भी स्थानीय परिवर्तन अनियमित रूप से खो जाएगा। और शायद कोई दूसरा व्यक्ति सोचता होगा कि केवल फाइलें हटा दी जाएंगी।
जॉन Douthat

119
सच कहूँ तो, मुझे नहीं पता कि क्यों। मुझे उम्मीद है कि वे एक कमांड जोड़ सकते हैं, हालांकि। ये 4 चरण बहुत जटिल हैं।
जॉन Douthat 1

25
यहाँ एक बैश स्क्रिप्ट है जो एक सबमॉड्यूल को हटाती है, बस सबमॉड्यूल
Capi Etheriel

33
rm -rf .git \ मॉड्यूल \ सबमॉडल नाम की भी आवश्यकता है?
रोजरपैक

484

सिर्फ एक नोट। 1.8.5.2 के बाद से, दो कमांड करेंगे:

git rm the_submodule
rm -rf .git/modules/the_submodule

जैसा कि @Mark Cheverton के उत्तर ने सही ढंग से बताया, यदि दूसरी पंक्ति का उपयोग नहीं किया गया है, भले ही आपने अभी के लिए सबमॉड्यूल को हटा दिया हो, फिर भी अवशेष .git / मॉड्यूल / the_submodule फ़ोल्डर उसी सबमॉड्यूल को वापस जोड़ने या भविष्य में प्रतिस्थापित करने से रोक देगा। । इसके अलावा, जैसा कि @VonC ने उल्लेख किया है, एक सबमॉड्यूल पर git rmअधिकांश काम करेगा।

--उपडेट (07/05/2017) -

बस स्पष्ट करने के लिए, the_submoduleपरियोजना के अंदर पनडुब्बी का सापेक्ष पथ है। उदाहरण के लिए, subdir/my_submoduleयदि सबमॉडल एक उपनिर्देशिका के अंदर है subdir

जैसा कि टिप्पणियों और अन्य उत्तरों में सही ढंग से बताया गया है , दो कमांड (हालांकि एक सबमॉड्यूल को हटाने के लिए कार्यात्मक रूप से पर्याप्त है), (जुलाई 2017 के अनुसार) के [submodule "the_submodule"]अनुभाग में एक ट्रेस छोड़ दें .git/config, जिसे तीसरे आदेश का उपयोग करके हटाया जा सकता है:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

5
मैं git संस्करण 2.4.9 पर हूँ (Apple git-60) और मुझे जो करना था वह था rm the_submodule। मैंने उसे धक्का दिया और फिर सबमॉड्यूल नाम के एक फ़ोल्डर को फिर से जोड़ दिया और यह बिना किसी समस्या के काम किया।
डेविड सिल्वा स्मिथ

19
यह सबमॉड्यूल प्रविष्टि को नहीं हटाता है .git/config। एक सबमॉडल हटाने के लिए संपूर्ण तरीके के लिए stackoverflow.com/a/36593218/1562138 देखें ।
fvgs

2
@drevicko मैंने अभी Git 2.11.1 के साथ इसका परीक्षण किया है और मैं पहले जैसा ही व्यवहार देखता हूं। प्रवेश और निर्देशिका और इसकी सामग्री के git init && git submodule add <repository> && git rm <name>पीछे छोड़ देता है । शायद आपने इसे हटाने से पहले सबमॉड्यूल को इनिशियलाइज़ नहीं किया था? .git/config.git/modules/<name>
fvgs

2
मुझे लगता है कि यह पहले सुरक्षित है .. git सबमॉडल deinit -f the_submodule
danday74

1
@JarrodSmith हाँ, यह रास्ता है। कृपया अपडेट देखें।
टिनिअक्स

478

इस प्रश्न के अधिकांश उत्तर पुराने, अधूरे या अनावश्यक रूप से जटिल हैं।

Git 1.7.8 या नए का उपयोग करके क्लोन किया गया एक सबमॉड्यूल आपके स्थानीय रेपो में स्वयं के अधिकांश चार निशान छोड़ देगा। नीचे दिए गए तीन आदेशों द्वारा उन चार निशानों को हटाने की प्रक्रिया दी गई है:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

39
इस उत्तर का इतना कम उत्थान क्यों हुआ? उन सभी लोकप्रिय उत्तर कुछ याद करते हैं, यह एकमात्र ऐसा है जो वास्तव में एक सबमॉड्यूल के सभी निशान को हटा देता है, सबसे सरल संभव तरीके से। और ध्यान दें: आदेशों का क्रम मायने रखता है।
mbdevpl

2
मेरे स्वयं के प्रश्न का उत्तर देने के लिए: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Thomas

5
@mbdevpl स्वीकृत उत्तर के 3 साल बाद आया, और मुझे लगता है कि कोई भी इस ओपी को स्वीकार करने में कामयाब नहीं हुआ
एंडी

10
यह 2018 में जटिल जवाब नहीं है?
वॉरेन पी

9
.gitmodules फ़ाइल अभी भी इन आदेशों चल अप्रभावित लगता है
Fractalf

206

सरल कदम

  1. कॉन्फ़िगर प्रविष्टियों को निकालें:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. सूचकांक से निर्देशिका निकालें:
    git rm --cached $submodulepath
  3. कमिट
  4. अप्रयुक्त फ़ाइलों को हटाएं:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

कृपया ध्यान दें: $submodulepath इसमें स्लैश प्रमुख या पीछे नहीं है।

पृष्ठभूमि

जब आप ऐसा करते हैं git submodule add, तो यह केवल इसे जोड़ता है .gitmodules, लेकिन एक बार आपने git submodule initइसे जोड़ दिया .git/config

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

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

git rebase HEADपहले और git commit अंत में, यह एक अच्छा विचार है यदि आप इसे एक स्क्रिप्ट में रखते हैं।

इसके अलावा पर एक नजर है का जवाब कर सकते मैं एक Git submodule unpopulate?


1
मेरे पास बहुत सारे सबमॉड्यूल्स (और एक बड़ी गड़बड़) थी इसलिए मुझे उन्हें लूप के लिए पास करना पड़ा। चूंकि उनमें से अधिकांश जहां एक विशिष्ट निर्देशिका और एलएस आउटपुट के तहत ट्रेलिंग स्लैश शामिल थे। मैंने कुछ ऐसा किया for dir in directory/*; do git rm --cached $dir; done
पाब्लो ओल्मोस डी एगुइलेरा सी।

इस सूची को प्राप्त करने के लिए जिसे पुनरावर्ती विलोपन के लिए स्क्रिप्ट में उपयोग किया जा सकता है - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'- - ऐसा लगता है कि आपको वास्तव में ऐसा करना है यदि कोई गड़बड़ है, अन्यथा सिर्फgit submodule | grep -v '^+' | cut -d' ' -f3
गलत 0

2
उन मॉड्यूलों की सूची प्राप्त करने के लिए जहां कोई स्थानीय परिवर्तन नहीं किए गए थे -git submodule | grep '^+' | cut -d' ' -f2
१३:११

ध्यान दें, मैं शामिल करने के लिए किया था submodulenameदोहरे उद्धरण में "submodulename".. चर्चा करते हुए .git/configफ़ाइल
muon

सरल। कुशल। 2.25.0 में, चरण 1 के बाद, आप चरण .gitmodules की जरूरत कदम 2. से पहले बदल जाता है
मिशेल Donais

83

सिफारिशों के अलावा, मुझे rm -Rf .git/modules/path/to/submoduleउसी नाम के साथ एक नया सबमॉड्यूल जोड़ने में सक्षम होना पड़ा (मेरे मामले में मैं मूल के साथ एक कांटा बदल रहा था)


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

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

मैंने काम करने के लिए
--नाम

60

उपयोग कर जोड़ा गया एक सबमॉड्यूल हटाने के लिए:

git submodule add blah@blah.com:repos/blah.git lib/blah

Daud:

git rm lib/blah

बस।

गिट के पुराने संस्करणों के लिए (लगभग ~ 1.8.5) उपयोग:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

1
वास्तव में +1। यह केवल 1.8.3 git से सही उत्तर है। सही के रूप में स्वीकार किया जाना चाहिए।
Xananax

6
git rmअभी भी अंदर सामान छोड़ता है .git/modules/। (2.5.4)
रुडोल्फ एडमकोविक्स

1
@RudolfAdamkovic यह मेरे लिए काम करता है? ध्यान दें कि यह केवल सबमॉडल प्रविष्टि को हटाता है यदि सटीक पथ मेल खाता है; यदि आपने एक सबमॉड्यूल ले लिया है और तब इसका उपयोग git rmनहीं करता है; मेरे मैक पर 2.5.4 के साथ एक त्वरित परीक्षण .gitmodules फ़ाइल को अद्यतन करता है, जैसा कि यहाँ प्रलेखन में वर्णित है: git-scm.com/docs/git-rm#_submodules ... लेकिन अगर आपको प्लेटफ़ॉर्म का किसी प्रकार का संयोजन मिल गया है / संस्करण जहां ऐसा नहीं होता है, आपको संभवतः इसके बारे में बग दर्ज करना चाहिए।
डग

2
यह उत्तर पूरी तरह से सही नहीं है। dir और फ़ाइल git rmमें सामान छोड़ देता है (ubuntu, git 2.7.4)। अन्य उत्तर 100% काम करता है: stackoverflow.com/a/36593218/4973698.git/modules/.git/config
mbdevpl

50

आप में प्रवेश को निकालना होगा .gitmodulesऔर .git/config, और इतिहास से मॉड्यूल की सूची को हटा दें:

git rm --cached path/to/submodule

यदि आप git की मेलिंग सूची पर लिखेंगे तो शायद कोई आपके लिए एक शेल स्क्रिप्ट करेगा।


किसी भी शेल स्क्रिप्ट की कोई आवश्यकता नहीं है, अन्य उत्तर में
सबमॉडल के

42

आप दूसरों द्वारा दिए गए समाधानों को स्वचालित करने के लिए एक उपनाम का उपयोग कर सकते हैं:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

अपने git config में रखें, और फिर आप यह कर सकते हैं: git rms path/to/submodule


-1 चूंकि यह बहुत गलत है। FIRST: यह मानता है कि सबमॉडल का नाम और रास्ता एक जैसा है जो अक्सर ऐसा नहीं होता है । आईई git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two। सेकंड: आपको इसे सही पथ से निष्पादित करना होगा। gitउपनाम कार्यपत्री में कहीं भी काम करना चाहिए (या इनायत से विफल)। तृतीय: git config -f .git/configसबमॉड्यूल के भीतर विफल रहता है, जैसा कि .gitआमतौर पर एक फ़ाइल है।
टिनो

42

संक्षेप में, यह वही है जो आपको करना चाहिए:

  1. सेट path_to_submodulevar (कोई अनुगामी स्लैश):

    path_to_submodule=path/to/submodule

  2. .Gitmodules फ़ाइल से संबंधित पंक्ति हटाएं:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. .It / config से संबंधित अनुभाग हटाएं

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. केवल इंडेक्स से $ path_to_submodule को अनस्टेज और निकालें (जानकारी खोने से रोकने के लिए)

    git rm --cached $path_to_submodule

  5. ट्रैक। परिवर्तन के लिए किए गए परिवर्तन

    git add .gitmodules

  6. सुपरप्रोजेक्ट कमिट करें

    git commit -m "Remove submodule submodule_name"

  7. अब अनटैक किए गए सबमॉड्यूल फ़ाइलों को हटा दें

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


इसलिए मेरे परिवर्तन को खींचने वाले अन्य सभी को सबमॉडल कैश निकालने के लिए rm -rf $ path_to_submodule rm -rf .git / मॉड्यूल / $ path_to_submodule चलाना होगा?
j2emanue

मैं, अद्यतन करने की सलाह देते git submodule update। और अगर सबमॉड्यूल्स पथ को सही तरीके से अपडेट नहीं किया गया (एक त्रुटि फेंकता है), तो उन्हें हटा दें:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
luissquall

40

यदि सबमॉड्यूल गलती से जोड़ा गया था क्योंकि आपने जोड़ा, प्रतिबद्ध किया था और एक फ़ोल्डर को धक्का दिया था जो पहले से ही गिट रिपॉजिटरी (समाहित .git) था, तो आपके पास .gitmodulesसंपादित करने के लिए एक फ़ाइल या कुछ भी नहीं होगा .git/configइस मामले में आप सभी की जरूरत है:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , मैंने भी .gitकरने से पहले फ़ोल्डर को हटा दिया git add


बिल्कुल मेरा मामला
१28

37

मैंने पाया deinitकि मेरे लिए अच्छा काम करता है:

git submodule deinit <submodule-name>    
git rm <submodule-name>

से Git डॉक्स :

deinit

दिए गए सबमॉड्यूल्स को अपंजीकृत करें, अर्थात submodule.$name .IT / कॉन्फिग को उनके वर्क ट्री से एक साथ हटा दें ।


सहमत वही समाधान मिला। यह 2018 में आज का सबसे अच्छा तरीका है)
woto

1
इसने .it / मॉड्यूल / .. को नहीं हटाया। आपको उन्हें हटा देना चाहिए, @fvgs
Vilém Kurz

पता नहीं क्यों यह सरल और आसान समाधान नंबर 1 नहीं है
मार्क मैगॉन

AFAICS को नए gitएस के लिए यह सबसे सुरक्षित उत्तर लगता है deinit, जिसके बारे में पता है , क्योंकि अन्य उत्तर.git/modules/submodule निर्देशिका को बहुत जल्दी हटा देते हैं , जो लगता है कि नए gitएस को अभी या फिर असफल हो गया है। इसके अलावा (मेरी टिप्पणी वहां देखें) हटाना .git/modules/submoduleगलत रास्ता हो सकता है, इसलिए यह एक खतरनाक कदम है, सबसे अच्छा बाद में केवल तभी लिया जाता है जब आप gitशिकायत करते हैं (या यदि आप 299% यह सुनिश्चित करना चाहते हैं कि यह सही रास्ता है और वास्तव में आवश्यक है)।
Tino

मुझे git commitकाम करने की गति में भी परिवर्तन करने की आवश्यकता है: modified .gitmodulesऔर deleted <submodule-path>
यूरी पॉज़्नानक

20

इस साइट पर सभी विभिन्न उत्तरों के साथ प्रयोग करने के बाद, मैं इस समाधान के साथ समाप्त हुआ:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

यह ठीक उसी स्थिति को पुनर्स्थापित करता है जैसे आपने सबमॉडल को जोड़ने से पहले किया था। आप तुरंत फिर से सबमॉड्यूल जोड़ सकते हैं, जो कि यहां अधिकांश उत्तरों के साथ संभव नहीं था।

git submodule add $giturl test
aboveScript test

यह आपको एक साफ चेकआउट के साथ छोड़ देता है जिसमें कोई परिवर्तन नहीं है।

इसके साथ परीक्षण किया गया था:

$ git --version
git version 1.9.3 (Apple Git-50)

क्यों प्रयोग करते हैं git rm --cached $pathतो rm -rf $pathके बजाय git rm -r $path?
bfontaine

-1 काम नहीं करता है यदि आप एक सबमॉड्यूल के भीतर एक सबमॉड्यूल को हटाने की कोशिश करते हैं (सबमॉड्यूल पेड़ बना सकता है)। इसके अलावा गुम होने के कारण यह खतरनाक रूप से छोटी गाड़ी है ! उदाहरण git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> जब आप अपनी स्क्रिप्ट के साथ 'खतरनाक .. सबमॉड्यूल' को हटाने की कोशिश करते हैं, तो यह वह होगा rm -rf ..जो सबसे अधिक संभावना नहीं है कि आप क्या चाहते हैं ..
Tino

17

मैं वर्तमान में Dec 2012 क्या कर रहा हूँ (इनमें से अधिकांश उत्तरों को जोड़ती है):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

15

मैंने जो किया था यह रहा :

1.) .gitmodules फ़ाइल से संबंधित अनुभाग हटाएं। आप नीचे दिए गए आदेश का उपयोग कर सकते हैं:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) .gitmodulesपरिवर्तनों को चरणबद्ध करें

git add .gitmodules

3.) संबंधित अनुभाग को हटाएं .git/config। आप नीचे दिए गए आदेश का उपयोग कर सकते हैं:

git submodule deinit -f "submodule_name"

4.) निकालें gitlink (कोई अनुगामी स्लैश):

git rm --cached path_to_submodule

5.) सफाई .git/modules:

rm -rf .git/modules/path_to_submodule

6.) प्रतिबद्ध:

git commit -m "Removed submodule <name>"

7.) अब अनटैक्सड सबमॉड्यूल फाइल्स को डिलीट करें

rm -rf path_to_submodule

इसके लिए धन्यवाद। मेरे लिए, मुझे पहले तीन चरणों के आदेश को 3), 1), 2) को पुनर्व्यवस्थित करना था। कर 1) पहले fatal: no submodule mapping found in .gitmodules for path 'submodule_name'चरण 3 पर दिया । दोनों कदम हालांकि आवश्यक थे। (git v2.8.2)
U007D

13

मुझे हाल ही में एक git प्रोजेक्ट का पता चला है जिसमें कई उपयोगी git संबंधित कमांड शामिल हैं: https://github.com/visionmedia/git-extras

इसे स्थापित करें और टाइप करें:

git-delete-submodule submodule

फिर बातें की जाती हैं। सबमॉड्यूल निर्देशिका को आपके रेपो से हटा दिया जाएगा और अभी भी आपके फाइल सिस्टम में मौजूद है। तो आप की तरह परिवर्तन के लिए प्रतिबद्ध कर सकते हैं: git commit -am "Remove the submodule"


आप इसे इस रूप में कह सकते हैं git delete-submodule, जैसा git-extrasकि काम करने के लिए रास्ते में होना चाहिए। यह भी ध्यान दें कि मैं उपयोग न करने की सलाह देता हूंgit-extras , क्योंकि इसके कई हिस्से बेहद छोटी और खतरनाक हैं । IE git-delete-submoduleसंभवतः नीचे गलत रास्ते को हटा देता है .git/modules/*, क्योंकि यह मानता है कि मॉड्यूल और पथ समान हैं (जो कि अक्सर ऐसा नहीं होता है), और यदि आप किसी सबमॉड्यूल के भीतर एक सबमॉड्यूल को हटाने की कोशिश करते हैं तो यह सही तरीके से काम नहीं करता है। git-extras99% मददगार हो सकता है, लेकिन अगर चीजें पूरी तरह से गलत तरीके से इसका इस्तेमाल करती हैं तो कृपया शिकायत न करें। आपको चेतावनी दी गई है!
तिनो

10

मुझे जॉन डौटहट के कदमों को एक कदम आगे और cdसबमॉड्यूल की निर्देशिका में ले जाना था, और फिर गिटोसोस को हटाना था:

cd submodule
rm -fr .git

तब मैं एक सबमॉडल के पुराने संदर्भ के बिना माता-पिता गिट रिपॉजिटरी के एक हिस्से के रूप में फाइल कर सकता था।


पिछले एक "घातक: नहीं एक गिट रिपॉजिटरी:" त्रुटि जब git rm --cacheकदम करने की कोशिश कर पाने के लिए मुझे भी ऐसा करना पड़ा ।
रिकोड टीटी

9

यहाँ 4 चरण हैं जो मुझे आवश्यक या उपयोगी लगे (पहले वाले महत्वपूर्ण):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

सिद्धांत रूप में , git rmमें चरण 1 इसके बारे में ध्यान रखना चाहिए। उम्मीद है, ओपी प्रश्न के दूसरे भाग का उत्तर एक दिन सकारात्मक रूप से दिया जा सकता है (कि यह एक कमांड में किया जा सकता है)।

लेकिन जुलाई 2017 तक, चरण 2 के लिए डेटा को निकालना आवश्यक है .git/modules/अन्यथा, आप उदाहरण के लिए भविष्य में सबमॉडल को वापस नहीं जोड़ सकते।

आप शायद 1.8.5+ के लिए उपर्युक्त दो चरणों के साथ टिनिलेक्स के उत्तर के रूप में सभी के रूप में नोट कर सकते हैंgit submodule कमांड काम करते हैं।

चरण 3 the_submoduleफ़ाइल के लिए अनुभाग निकालता है.git/config । यह पूर्णता के लिए किया जाना चाहिए। (प्रविष्टि पुराने गिट संस्करणों के लिए समस्याएं पैदा कर सकती है, लेकिन मेरे पास परीक्षण करने के लिए एक नहीं है)।

इसके लिए, अधिकांश उत्तर का उपयोग करने का सुझाव देते हैं git submodule deinit। मुझे यह अधिक स्पष्ट और उपयोग करने में कम भ्रमित लगता है git config -f .git/config --remove-section। के अनुसार Git-submodule प्रलेखन , git deinit:

दिए गए सबमॉड्यूल्स को अनरजिस्टर्ड करें ... यदि आप वास्तव में रिपॉजिटरी से एक सबमॉड्यूल हटाना चाहते हैं और इसके बजाय git-rm [1] का उपयोग करते हैं

अंतिम लेकिन कम से कम, यदि आप नहीं करते हैं, तो आपको ऐसा करते git commitसमय एक त्रुटि मिलेगी / हो सकती है git submodule summary(git 2.7 के अनुसार):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

यह इस बात की परवाह किए बिना है कि आप चरण 2 या 3 करते हैं।


7
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

7

मुझे बस .submodule (सटीक नाम भूल गया) छिपी हुई फ़ाइल मिली, इसकी एक सूची है ... आप उन्हें व्यक्तिगत रूप से इस तरह मिटा सकते हैं। मेरे पास बस एक था, इसलिए मैंने इसे हटा दिया। सरल, लेकिन यह गिट को गड़बड़ कर सकता है, क्योंकि मुझे नहीं पता कि क्या सबमॉडल से जुड़ा है। लगता है अब तक, libetpan के सामान्य उन्नयन मुद्दे से अलग है, लेकिन यह (उम्मीद है) असंबंधित है।

नोट किया गया कि किसी ने मैन्युअल इरेज़िंग पोस्ट नहीं किया है, इसलिए जोड़ा गया



7

2.17 git और इसके बाद के संस्करण के साथ:

git submodule deinit -f {module_name}
git add {module_name}
git commit

, काम नहीं किया न के लिए git 2.17.1और न ही git 2.20.1। हालांकि दोनों के लिए काम git rmकरने के बजाय उपयोग करना git add। नोट्स: अगर चीजें साफ हैं तो -fजरूरत नहीं है । के लिए सुनिश्चित करें विकल्प का उपयोग कभी नहीं के साथ gitअगर आप अनायास ही डेटा हानि के खिलाफ की रक्षा करना चाहते हैं। यह भी ध्यान दें कि यह .git/modules/{module_name}जगह में छोड़ देता है। इसे वहां रखने के लिए सबसे अच्छा अभ्यास है क्योंकि gitसही (!) प्रिंट करता है, अगर इसके कारण कुछ अवरुद्ध है, तो आगे बढ़ने में मदद करें।
तिनो

4

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


3

पाठक के लाभ के लिए, यह यहाँ इसे समेटने की कोशिश करता है और चरण-दर-चरण मार्गदर्शिका देता है कि यह कैसे करना है यदि चीजें अपेक्षा के अनुरूप काम नहीं करती हैं। पीछा कर रहा है परीक्षण किया है और सुरक्षित तरीका के लिए gitसंस्करण 2.17और इसके बाद के संस्करण एक submodule से छुटकारा पाने के :

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • यदि यह आपके लिए काम नहीं करता है, तो नीचे देखें।
  • कोई विकल्प नहीं। कुछ भी खतरनाक नहीं। और अधिक करने पर भी विचार नहीं करते!
  • डेबियन बस्टर 2.20.1और उबंटू 18.04 के साथ परीक्षण किया गया2.17.1
  • "$submodule" केवल इस बात पर जोर देना है कि नाम कहां रखा जाए, और आपको रिक्त स्थान और इस तरह से सावधान रहना होगा
  • यदि विंडोज पर पहली लाइन को नजरअंदाज किया जाए और सबमॉड्यूल "$submodule"के लिए एक ठीक से निर्दिष्ट पथ के विंडोज तरीके से प्रतिस्थापित किया जाए। (मैं विंडोज नहीं हूँ)

चेतावनी!

कभी भी .gitनिर्देशिका के इनडायरेक्ट को स्पर्श न करें ! अंदर संपादन.git अंधेरे पक्ष में प्रवेश करता है। हर कीमत पर दूर रहें!

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

मुझे लगता है कि प्रलेखन में बहुत खतरनाक हिस्सा है git submodule। यह $GIT_DIR/modules/<name>/खुद को दूर करने की सलाह देता है । मेरी समझ में यह केवल सादा गलत नहीं है, यह बेहद खतरनाक है और भविष्य में प्रमुख सिरदर्द को उकसाता है! निचे देखो।

ध्यान दें कि

git module deinit

से सीधा उलटा है

git module init

परंतु

git submodule deinit -- module
git rm -- module

भी काफी उलटा है

git submodule add -- URL module
git submodule update --init --recursive -- module

क्योंकि कुछ आज्ञाओं को मूल रूप से केवल एक ही चीज़ से अधिक करने की आवश्यकता होती है:

  • git submodule deinit -- module
    • (१) अपडेट .git/config
  • git rm
    • (2) मॉड्यूल की फ़ाइलों को निकालता है
    • (3) जिससे पुन: सबमॉड्यूल के सबमॉड्यूल्स को हटा दिया जाता है
    • (४) अद्यतन .gitmodules
  • git submodule add
    • डेटा में खींचता है .git/modules/NAME/
    • (1) करता है git submodule init, इसलिए अपडेट करता है.git/config
    • (2) करता है git submodule update, इसलिए, गैर-मॉड्यूल की जाँच करता है
    • (४) अद्यतन .gitmodules
  • git submodule update --init --recursive -- module
    • यदि आवश्यक हो तो आगे डेटा में खींचता है
    • (3) सबमॉड्यूल के सबमॉड्यूल्स की पुनरावृत्ति की जाँच करता है

यह पूरी तरह से सममित नहीं हो सकता है, क्योंकि इसे सख्ती से सममित रखने से बहुत अधिक समझ में नहीं आता है। बस दो से अधिक आदेशों की आवश्यकता नहीं है। इसके अलावा "डेटा में खींच" अंतर्निहित है, क्योंकि आपको इसकी आवश्यकता है, लेकिन कैश की गई जानकारी को निकालना नहीं है, क्योंकि यह बिल्कुल भी आवश्यक नहीं है और कीमती डेटा मिटा सकता है।

यह वास्तव में नए लोगों के लिए अजीब है, लेकिन मूल रूप से एक अच्छी बात है: gitबस स्पष्ट रूप से काम करता है और वह सही करता है, और अधिक करने की कोशिश भी नहीं करता है। gitएक उपकरण है, जो एक विश्वसनीय काम करना चाहिए, बजाय केवल एक और "Eierlegende Wollmilchsau" ("Eierlegende Wollmilchsau" मेरे लिए "एक स्विस सेना के चाकू के कुछ बुरे संस्करण") का अनुवाद करता है।

इसलिए मैं लोगों की शिकायतों को समझता हूं, " gitमेरे लिए स्पष्ट काम क्यों नहीं करता है"। ऐसा इसलिए है क्योंकि यहाँ "स्पष्ट" दृष्टिकोण से निर्भर करता है। प्रत्येक स्थिति में विश्वसनीयता कहीं अधिक महत्वपूर्ण है। इसलिए आपके लिए जो स्पष्ट है वह प्रायः सभी संभव तकनीकी स्थितियों में सही नहीं है। कृपया याद रखें कि: वायुसेनाgit तकनीकी पथ का अनुसरण करता है, न कि सामाजिक। (इसलिए चतुर नाम: git)

यदि यह विफल रहता है

ऊपर दिए गए आदेश निम्नलिखित के कारण विफल हो सकते हैं:

  • आपका gitबहुत पुराना है। फिर एक नया प्रयोग करें git। (नीचे देखें कि कैसे)
  • आपके पास डेटा नहीं है और डेटा खो सकता है। फिर पहले उन्हें बेहतर तरीके से प्रतिबद्ध करें।
  • आपका सबमॉडल एक git cleanमायने में साफ नहीं है। फिर उस कमांड का उपयोग करके पहले अपने सबमॉड्यूल को साफ करें। (निचे देखो।)
  • आपने अतीत में कुछ किया है जो कि असमर्थित है git । फिर आप अंधेरे की ओर हैं और चीजें बदसूरत और जटिल हो जाती हैं। (शायद किसी अन्य मशीन का उपयोग करके इसे ठीक करता है।)
  • शायद विफल होने के और भी तरीके हैं जिनके बारे में मुझे जानकारी नहीं है (मैं सिर्फ कुछ gitपावर-उपयोगकर्ता हूं ।)

संभव फिक्स का पालन करें।

एक नए का उपयोग करें git

यदि आपकी मशीन बहुत पुरानी है, तो आप में कोई भी नहीं submodule deinitहै git। यदि आप नहीं चाहते (या कर सकते हैं) अपने अद्यतन git, तो बस एक नए के साथ एक और मशीन का उपयोग करें git! gitपूरी तरह से वितरित करने के लिए है, इसलिए आप gitकाम पूरा करने के लिए दूसरे का उपयोग कर सकते हैं :

  • workhorse:~/path/to/worktree$ git status --porcelain कुछ भी आउटपुट नहीं करना चाहिए ! यदि ऐसा होता है, तो पहले चीजों को साफ करें!
  • workhorse:~/path/to/worktree$ ssh account@othermachine
  • othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
  • अब सबमॉड्यूल स्टफ करें
  • othermachine:~/TMPWORK$ git commit . -m . && exit
  • workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
  • workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD। यदि यह काम नहीं करता है, तो उपयोग करेंgit reset --soft FETCH_HEAD
  • अब चीजों git statusको साफ करें , जब तक फिर से साफ न हो जाए। आप ऐसा करने में सक्षम हैं, क्योंकि आपने पहले चरण के लिए इसे पहले साफ कर दिया है।

यह othermachineविंडोज के तहत कुछ वीएम, या कुछ उबंटू डब्ल्यूएसएल हो सकता है, जो भी हो। यहां तक ​​कि एक chroot(लेकिन मुझे लगता है कि आप गैर-रूट हैं, क्योंकि यदि आप हैं rootतो नए को अपडेट करना अधिक आसान होना चाहिए git)।

ध्यान दें कि यदि आप नहीं कर सकते हैं ssh, तो gitरिपॉजिटरी को परिवहन करने के तरीकों के ट्रेन लोड हैं । आप कुछ USB स्टिक ( .gitडायरेक्टरी सहित ) पर अपने वर्कट्री को कॉपी कर सकते हैं और स्टिक से क्लोन कर सकते हैं। कॉपी को क्लोन करें, बस चीजों को फिर से साफ-सुथरे अंदाज में पाने के लिए। यह एक पीआईटीए हो सकता है, यदि आपका सबमॉडल्स सीधे अन्य ममीने से सुलभ नहीं हैं। लेकिन इसके लिए एक समाधान भी है:

git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX

आप इस गुणा उपयोग कर सकते हैं, और इस में सहेजा गया है $HOME/.gitconfig। कुछ इस तरह

git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/

जैसे URL फिर से लिखते हैं

https://github.com/XXX/YYY.git

में

/mnt/usb/repo/XXX/YYY.git

यदि आप gitइस तरह शक्तिशाली सुविधाओं के आदी होने लगते हैं तो यह आसान है ।

पहले चीजों को साफ करें

मैन्युअल रूप से सफाई करना अच्छा है, क्योंकि इस तरह से आप शायद कुछ ऐसी चीजों का पता लगाते हैं जिनके बारे में आप भूल गए हैं।

  • यदि गिट बिना सहेजे गए सामान के बारे में शिकायत करता है, तो उसे सुरक्षित कहीं पर धकेलें।
  • अगर गिट कुछ बचे हुए के बारे में शिकायत करता है, git statusऔर git clean -ixfdआपका दोस्त है
  • विकल्पों के अनुसार rmऔर deinitजब तक आप कर सकते हैं, तब तक छोड़ने का प्रयास करें । यदि आप प्रो हैं तो विकल्प (जैसे -f) gitअच्छे हैं। लेकिन जैसा कि आप यहां आए थे, आप शायद इस submoduleक्षेत्र में इतने अनुभवी नहीं हैं। इसलिए बेहतर है कि क्षमा करें।

उदाहरण:

$ git status --porcelain
 M two
$ git submodule deinit two
error: the following file has local modifications:
    two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
    md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
    tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
  NEW
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each
    5: quit                 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'

तुम देखते हो, कोई -fजरूरत नहीं है submodule deinit। अगर चीजें साफ हैं, एक git cleanअर्थ में। यह भी ध्यान दें कि git clean -xजरूरत नहीं है। इसका मतलब है git submodule deinitबिना शर्त फाइलें हटा दी जाती हैं जिन्हें नजरअंदाज कर दिया जाता है। यह आमतौर पर आप क्या चाहते हैं, लेकिन इसके बारे में मत भूलना। कभी-कभी नजरअंदाज की गई फाइलें कीमती हो सकती हैं, जैसे कैश्ड डेटा जो फिर से गणना किए जाने में घंटों लेता है।

कभी हटाए क्यों नहीं $GIT_DIR/modules/<name>/?

संभवतः लोग कैश्ड रिपॉजिटरी को हटाना चाहते हैं, क्योंकि वे बाद में किसी समस्या में भाग लेने से डरते हैं। यह सच है, लेकिन इसे हल करने का सही तरीका "समस्या" है! क्योंकि तय करना आसान है, और सही किया गया तो आप कभी भी खुशी से रह पाएंगे। जब आप डेटा को हटाते हैं तो यह अधिक बोझिल परेशानी से बचता है।

उदाहरण:

mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two

त्रुटि के बाद अंतिम पंक्ति आउटपुट:

A git directory for 'two' is found locally with remote(s):
  origin    https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
  https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

यह त्रुटि क्यों? क्योंकि .git/modules/two/पहले से बसा हुआ था https://github.com/hilbix/empty.git और अब कुछ और से फिर से आबादी की जाएगी, अर्थात् https://github.com/hilbix/src.git । यदि आप इसे https://github.com/hilbix/empty.git से पुन: आबाद करते हैं, तो आप इसे नहीं देख पाएंगे

अब क्या करे? खैर, जैसा बताया गया है वैसा ही करें! उपयोग--name someunusedname

git submodule add --name someunusedname https://github.com/hilbix/src.git two

.gitmodules फिर जैसा दिखता है

[submodule "someunusedname"]
    path = two
    url = https://github.com/hilbix/src.git

ls -1p .git/modules/ देता है

someunusedname/
two/

इस तरह से भविष्य में आप शाखाओं को बदल सकते हैं / आगे और पीछे कर सकते हैं औरtwo/ दो अलग (और संभवतः असंगत) अपस्ट्रीम रिपॉजिटरी होने के कारण फिर से किसी भी परेशानी में नहीं पड़ेंगे। और सबसे अच्छा है: आप दोनों को स्थानीय रूप से कैश्ड भी रखते हैं।

  • यह केवल आपके लिए सच नहीं है। यह आपके रिपॉजिटरी का उपयोग करके अन्य सभी के लिए भी सही है।
  • और आप इतिहास नहीं खोते हैं। यदि आप पुराने सबमॉड्यूल के नवीनतम संस्करण को आगे बढ़ाना भूल गए हैं, तो आप स्थानीय कॉपी में प्रवेश कर सकते हैं और बाद में ऐसा कर सकते हैं। ध्यान दें कि यह काफी सामान्य है कि कोई व्यक्ति कुछ सबमॉड्यूल को धकेलना भूल जाता है (क्योंकि यह नए लोगों के लिए एक पीआईटीए है, जब तक कि वे आदी नहीं हो जाते git)।

हालाँकि यदि आपने कैश की गई निर्देशिका को हटा दिया है, तो दोनों अलग-अलग चेकआउट एक-दूसरे पर ठोकर खाएंगे, क्योंकि आप --nameविकल्पों का उपयोग नहीं करेंगे , है ना? इसलिए हर बार जब आप चेकआउट करते हैं तो आपको बार-बार .git/modules/<module>/डायरेक्टरी को हटाना पड़ता है। यह बेहद बोझिल है और कुछ का उपयोग करना कठिन बनाता है git bisect

तो इस मॉड्यूल निर्देशिका को प्लेसहोल्डर के रूप में रखने के लिए एक बहुत ही तकनीकी कारण है। जो लोग नीचे कुछ निकालने की सलाह देते हैं वे .git/modules/या तो बेहतर नहीं जानते हैं या आपको यह बताना भूल जाते हैं कि यह शक्तिशाली सुविधाओं को git bisectलगभग असंभव बना देता है अगर यह इस तरह के एक उप-असंगतता को पार करता है।

एक और कारण ऊपर दिखाया गया है। को देखो ls। आप वहां क्या देखते हैं?

ठीक है, मॉड्यूल two/का दूसरा संस्करण नहीं है .git/modules/two/, यह नीचे है .git/modules/someunusedname/! तो ऐसी चीजें git rm $module; rm -f .git/module/$moduleपूरी तरह से गलत हैं! हटाने के लिए आपको module/.gitया तो परामर्श करना होगा या .gitmodulesसही बात का पता लगाना होगा!

तो न केवल अन्य उत्तर इस खतरनाक जाल में आते हैं, यहां तक ​​कि बहुत लोकप्रिय gitएक्सटेंशन में यह बग था ( यह अब वहां तय हो गया है )! तो बेहतर है कि .git/निर्देशिका के अपने हाथ रखें यदि आप वास्तव में नहीं हैं, तो आप क्या कर रहे हैं!

और दार्शनिक दृष्टिकोण से, इतिहास को मिटा देना हमेशा गलत है! हमेशा की तरह क्वांटम यांत्रिकी को छोड़कर , लेकिन यह कुछ पूरी तरह से अलग है।

FYI करें आप शायद यह अनुमान लगाते हैं : hilbix मेरा GitHub खाता है।


पोस्ट का यह विश्वकोश वास्तविक उत्तर और विभिन्न "समस्या निवारण" / आदि वर्गों को इंगित करने के लिए बड़े / स्पष्ट उप शीर्षकों के साथ स्पष्ट वर्गों में विभाजित किया जाना चाहिए।
एंड्रयू

2

संक्षेप में, यह वही है जो आपको करना चाहिए:

Path_to_submodule var (कोई अनुगामी स्लैश नहीं) सेट करें:

path_to_submodule=path/to/submodule

.Gitmodules फ़ाइल से संबंधित पंक्ति हटाएं:

git config -f .gitmodules --remove-section submodule.$path_to_submodule

.It / config से संबंधित अनुभाग हटाएं

git config -f .git/config --remove-section submodule.$path_to_submodule

केवल इंडेक्स से $ path_to_submodule को अनस्टेज और निकालें (जानकारी खोने से रोकने के लिए)

git rm --cached $path_to_submodule

ट्रैक। परिवर्तन के लिए किए गए परिवर्तन

git add .gitmodules

सुपरप्रोजेक्ट कमिट करें

git commit -m "Remove submodule submodule_name"

अब अनटैक किए गए सबमॉड्यूल फ़ाइलों को हटा दें

rm -rf $path_to_submodule

rm -rf .git/modules/$path_to_submodule

इसे भी देखें: वैकल्पिक गाइड लाइन्स


क्या आप इसे 'git सबमॉड्यूल ऐड' के बाद सबमॉडल हटाने के तरीके के साथ बढ़ा सकते हैं, लेकिन कभी इसे कमिट किए बिना? मुझे लगता है कि उस मामले में, सबमॉडल को हटाने के लिए किसी भी प्रतिबद्ध की आवश्यकता नहीं है, है ना?
कार्लो वुड

मुझे लगता है कि आपको स्वैप करने की आवश्यकता है git rm --cached $path_to_submoduleऔर git add .gitmodulesनहीं? मुझे पहली कमांड पर एक त्रुटि मिली: fatal: Please stage your changes to .gitmodules or stash them to proceedक्योंकि मेरे पास अस्थिर परिवर्तन थे .gitmodulesgit add .gitmodulesपहले हल जो कर रहे हो।
कार्लो वुड

2

यह आसान है:

  1. सेक्शन निकालें .gitmodules
  2. कॉल करें: git add .gitmodules
  3. कॉल करें: git submodule deinit <path to submodule>
  4. कॉल करें: git rm <path to submodule>
  5. कमिट और पुश

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


2
मेरे लिए यह कॉल करने के लिए पर्याप्त था git submodule deinit <submodule_name>और git rm <path_to_submodule>। अंतिम कमांड स्वचालित रूप से अंदर की प्रविष्टि को हटा देती है .gitmodules। गेट
२.१it

1

मैंने हटाने की प्रक्रिया को आसान बनाने के लिए एक बैश स्क्रिप्ट बनाई है। यह यह भी जाँचता है कि क्या सहेजे गए रेपो में परिवर्तन हैं और पुष्टि के लिए पूछते हैं। यह परीक्षण किया गया os xहै कि यह जानना दिलचस्प होगा कि क्या यह सामान्य लिनक्स डिस्ट्रोस पर भी काम करता है:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f


0

लेटेस्ट git में git सबमॉडल को हटाने के लिए सिर्फ 4 ऑपरेशन की जरूरत होती है।

  • में संबंधित प्रविष्टि निकालें .gitmodules
  • स्टेज बदलता है git add .gitmodules
  • सबमॉड्यूल निर्देशिका निकालें git rm --cached <path_to_submodule>
  • इसे कमिट करें git commit -m "Removed submodule xxx"

0

यदि आपको इसे नीचे की तरह बैश स्क्रिप्ट के साथ एक पंक्ति कमांड में करने की आवश्यकता है :

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

$HOMEनाम में dir में बैश स्क्रिप्ट फ़ाइल बनाएँ remove_submodule.sh:

#!/bin/bash

git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet


0
  • एक सबमॉड्यूल को चलाकर हटाया जा सकता है git rm <submodule path> && git commit। यह प्रयोग करके पूर्ववत किया जा सकता है git revert
    • विलोपन, सुपरप्रोजेक्ट के ट्रैकिंग डेटा को हटा देता है, जो .gitmodulesफ़ाइल में gitlink प्रविष्टि और अनुभाग दोनों हैं ।
    • सबमॉड्यूल की वर्किंग डाइरेक्टरी को फाइल सिस्टम से हटा दिया जाता है, लेकिन Git डाइरेक्टरी को इसके आसपास रखा जाता है, क्योंकि यह किसी अन्य रिपॉजिटरी से प्राप्त किए बिना पिछले कमिट्स को चेकआउट करना संभव बनाता है।
  • एक सबमॉड्यूल को पूरी तरह से हटाने के लिए, अतिरिक्त रूप से मैन्युअल रूप से हटाएं$GIT_DIR/modules/<name>/

स्रोत: git help submodules


-1

गिट उपमॉडल हटाना

एक gitसबमॉडल को हटाने के लिए नीचे 4 चरणों की आवश्यकता होती है।

  1. .gitmodulesफ़ाइल में संबंधित प्रविष्टि निकालें । प्रविष्टि नीचे उल्लिखित की तरह हो सकती है
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. स्टेज बदलता है git add .gitmodules
  2. सबमॉड्यूल निर्देशिका निकालें git rm --cached <path_to_submodule>
  3. इसे कमिट करें git commit -m "Removed submodule xxx"और पुश करें।

नीचे दिए गए अतिरिक्त 2 और चरणों को स्थानीय क्लोन कॉपी में पूरी तरह से सबमॉड्यूल को साफ करने की आवश्यकता है।

  1. .git/configफ़ाइल में संबंधित प्रविष्टि निकालें । प्रविष्टि नीचे उल्लिखित की तरह हो सकती है
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. करना rm -rf .git/modules/path_to_submodule

ये 5 वें और 6 वें चरण में कोई बदलाव नहीं किया गया है जिसके लिए प्रतिबद्ध होने की जरूरत है।


यदि आप git-scm.com/docs/git-submodule#Documentation/… का उपयोग करेंगे तो यह बहुत आसान होगाgit submodule deinit
काला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.