एक गिट सबमॉडल का नाम बदलें


156

क्या एक गिट उपमॉडल निर्देशिका ( इसे हटाने की पूरी गति से गुजरने के अलावा और एक नए गंतव्य नाम के साथ फिर से जोड़ने) के अलावा कुछ आसान तरीका है ।

और जब हम इस पर होते हैं, तो ऐसा क्यों होता है कि मैं केवल मूल निर्देशिका में निम्नलिखित नहीं कर सकता: git mv old-submodule-name new-submodule-name


6
.gitmodulesसबमॉडल चलते समय आपको मैन्युअल रूप से अपडेट करने की आवश्यकता नहीं होगी । देखने के नीचे मेरा उत्तर
VonC

@ VonC के जवाब ने मेरे लिए एक आकर्षण की तरह काम किया
दोपहर

गिट मॉड्यूल बहुत जटिल हैं। npmदिखाता है कि कैसे सरल काम करता है। एक दिन ... हो सकता है ... कोई व्यक्ति ... इसे फिर से लिखेगा ... इस बीच ...
रॉल्फ

@ VonC का जवाब आज तक की पूरी कहानी नहीं है: यह वास्तव में .itmodules को बदल देगा, लेकिन केवल नाम का ही नहीं, बल्कि पथ का नाम बदलेगा। पूर्ण प्रक्रिया को पूरा करने के लिए आपको एक .itmodules और एक 'गिट सबमॉडल सिंक' को सही करने के लिए एक अतिरिक्त संपादन की आवश्यकता है
zertyz

@zertyz: संपत्ति [submodule "name_of_submodule"] एक Git आंतरिक नाम है, आप इसे अपने आप को भ्रमित न करने के लिए नाम बदल सकते हैं लेकिन यह सिर्फ एक लेबल है।
एमकेस्पर

जवाबों:


101

मैं निम्नलिखित वर्कफ़्लो काम कर पाया:

  • अद्यतन .itmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

नोट: यह दृष्टिकोण GIT के 2018 संस्करणों में सूचकांक और .itmodules को ठीक से अद्यतन नहीं करता है।

नोट: आप अभी कर सकते हैं बस git mv oldpath newpathअब करते हैं, जैसा कि VonC के उत्तर में बताया गया है । (सुनिश्चित करें कि आप git के नवीनतम संस्करण का उपयोग कर रहे हैं)


22
स्वयं पर ध्यान दें: git add newpathएक पीछे वाले स्लैश का उपयोग न करें
परमाणु

10
इस तरह के वर्कफ़्लो के साथ, आप केवल उप-निर्देशिका में एक उप-निर्देशिका बनाएंगे जिसे आप एक सबमॉड्यूल के रूप में उपयोग करते हैं। साइमलिंक वैश्विक सबमॉड्यूल कार्यक्षमता का एक हिस्सा है। यह मतलब है जब आप रेपो है जिसका नाम submodules का उपयोग क्लोन, आपको निम्न त्रुटि के साथ खत्म हो सकता है कि: कोई submodule मानचित्रण पथ के लिए .gitmodules में 'अपना-oldpath' आप oldpath (* Git rm oldpath निकालने के बाद पाया ), तो आपको चाहिए git submodule का उपयोग REPO-URL newpath के बजाय "git add newpath * करें। जब किया जाता है, तो git स्टेटस कुछ इस तरह प्रदर्शित होगा: नया नाम: पुरानापथ -> नयापथ
बर्ट्रेंड

5
यह समाधान मेरे लिए काम नहीं करता है क्योंकि git ऐड कमांड का उपयोग करते समय, सबमॉड्यूल को एक साधारण निर्देशिका के रूप में प्रोजेक्ट में शामिल किया गया था न कि एक सबमॉड्यूल के रूप में। $ mv submodule-oldpath ~ / एक और-स्थान $ Git rm submodule-oldpath $ Git submodule ऐड submodule-भंडार-यूआरएल submodule-Newpath कोशिश bcachet.github.io/development/2012/05/25/rename-git-submodule
महमूद एडम

3
यदि आपको काम करने वाले पेड़ के साथ समस्या है, तो आप .git/modules/SUBMODULE/configफ़ाइल को भी संपादित कर सकते हैं , जैसे कि worktreeफिर से सही निर्देशिका के बिंदु।
विंसेंट केटेलार्स

3
इसने मेरे साथ काम नहीं किया 2.13.1। लेकिन बस git mv old newएक आकर्षण की तरह काम कर रहा है । मुझे केवल परिवर्तनों को पूरा करने के लिए प्रतिबद्ध होने की आवश्यकता है।
उपयोगकर्ता

226

Git1.8.5 (अक्टूबर 2013) प्रक्रिया को सरल बनाना चाहिए । बस एक करें:

git mv A B

" git mv A B", जब एक सबमॉड्यूल Aको स्थानांतरित करना अपने काम के पेड़.gitmodules को स्थानांतरित करने और फ़ाइल में पथों को समायोजित करने के लिए सिखाया गया है ।


कमिट में और देखें 0656781fadca1 :

वर्तमान में git mvएक सबमॉड्यूल पर " " का उपयोग करते हुए सुपरप्रोजेक्ट में सबमॉड्यूल के कार्य ट्री को स्थानांतरित करता है। लेकिन सबमॉड्यूल की पथ सेटिंग को .gitmodulesअछूता छोड़ दिया गया है, जो अब काम के पेड़ के साथ असंगत है और गिट कमांड बनाता है जो उचित path -> name mapping(जैसे ) पर भरोसा करते हैं statusऔर diffअजीब व्यवहार करते हैं।

करने दें " git mv" केवल submodule के काम पेड़ नहीं चलती बल्कि अपडेट करके मदद यहाँ " submodule.<submodule name>.path" से सेटिंग .gitmodulesफ़ाइल और मंच दोनों।
यह तब नहीं होता है जब कोई .gitmodulesफ़ाइल नहीं मिलती है और केवल एक चेतावनी जारी करता है जब इसमें इस सबमॉड्यूल के लिए कोई अनुभाग नहीं होता है। ऐसा इसलिए है क्योंकि उपयोगकर्ता .gitmodulesफ़ाइल के बिना सिर्फ सादे gitlinks का उपयोग कर सकता है या "git mv" कमांड जारी करने से पहले हाथ से पथ सेटिंग को अपडेट कर सकता है (जिस स्थिति में चेतावनी उसे याद दिलाती है कि mvउसने उसके लिए ऐसा किया होगा)।
केवल जब .gitmodulesपाया जाता है और मर्ज संघर्ष होता है, तो mvकमांड विफल हो जाएगा और उपयोगकर्ता को फिर से प्रयास करने से पहले संघर्ष को हल करने के लिए कहेगा।


git 2.9 (जून 2016) git mvसबमॉडल के लिए बेहतर होगा :

Stefan Beller ( ) द्वारा a127331 (19 अप्रैल 2016) देखें । ( जूनियो सी हमानो द्वारा विलय - - में 9cb50a3 , 29 अप्रैल 2016)stefanbeller
gitster

mv: नेस्टेड सबमॉड्यूल को स्थानांतरित करने की अनुमति दें

" git mv old new" ने एक सबमॉड्यूल के लिए पथ को समायोजित नहीं किया है जो old/निर्देशिका के अंदर एक उपनिर्देशिका के रूप में सही ढंग से रहता है।

हालांकि सबमॉडल्स को अपने लिंक को गिट डायरेक्टरी के साथ-साथ .gitmodulesफाइल में अपडेट करने की आवश्यकता होती है।


स्वयं पर ध्यान दें: 1.8.4 पर यह प्रयास करें और आपके पास होगा fatal: source directory is empty, source=my_source, destination=my_destination। 1.8.5 के स्थिर रिलीज होने पर फिर से कोशिश करेंगे।
चेक

); @checksum लेकिन 1.8.5 एक स्थिर रिलीज, के लिए कम से कम कुछ है ... घंटे github.com/git/git/releases/tag/v1.8.5
VonC

मुझे स्रोत कोड से Git संस्करण 1.8.5.GIT बनाना था क्योंकि उबंटू रिपॉजिटरी में Git v.1.7.5 है। स्रोत कोड से Git का निर्माण कैसे करें
दिमित्री

2
@MaksimDmitriev लेकिन एक पीपीए (पर्सनल पैकेज संग्रह) है कि मैं में उल्लेख किया है के बारे में क्या stackoverflow.com/a/20918469/6309 ?
VonC

1
git mv सिर्फ इस उद्देश्य के लिए मेरी मशीन पर काम नहीं करता है।
अलेक्जेंडर डायगिलेव

13

सही समाधान है:

mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath

स्रोत: नाम बदलें submodule


2
क्या आपने इस शब्द को इस स्थान से शब्द के लिए खींचा है? bcachet.github.io/development/2012/05/25/rename-git-submodule यदि हां, तो कृपया अपने उत्तर में उस साइट को अटेंशन देना सुनिश्चित करें।
जॉर्ज स्टॉकर

11

मैंने ऊपर दिए गए सुझावों में से कुछ को आजमाया। मैं चल रहा हुँ:

$ git --version
git version 1.8.4

मैंने पाया कि सबमॉड्यूल को डी-इनिट करना, डायरेक्टरी को हटाना और एक नया सबमॉड्यूल बनाना सबसे अच्छा था।

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

कम से कम मेरे लिए सबसे अच्छा काम तो यही है। YMMV!


7

इसका नाम बदलना संभव नहीं है, इसलिए आपको इसे पहले हटाना होगा ( deinit) और फिर से जोड़ना होगा।

इसलिए इसे हटाने के बाद:

git submodule deinit <path>
git rm --cached <path>

आप इसमें डबल संदर्भ भी देख सकते हैं और हटा सकते हैं:

  • .gitmodules
  • .git/config
  • संदर्भ फ़ोल्डर को निकालें .git/modules/<name>(सबसे अच्छा बैकअप बनाने के लिए), क्योंकि प्रत्येक फ़ोल्डर में configफ़ाइल होती है जहां वह उसके संदर्भ को रखता हैworktree

इसके बाद अपने रेपो में कोई भी परिवर्तन करके अपने परिवर्तनों को चरणबद्ध करें:

git commit -am 'Removing submodule.'

और यदि आपके पास कोई बकाया मुद्दा नहीं है, तो दोबारा जांचें:

git submodule update
git submodule sync
git submodule status

तो अब आप गिट सबमॉड्यूल को फिर से जोड़ सकते हैं:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

यह भी वास्तव में आज है
एलेक्सी

प्रश्न शीर्षक एक मिथ्या नाम है, यह पथ से संबंधित है, न कि नाम
मैक्स रोबबर्ट

3

सबमॉड्यूल का नाम बदलने के लिए .gitmodules फ़ाइल को संपादित करें और फिर सबमॉड्यूल निर्देशिका का नाम बदलें।

मुझे लगता है कि आपको git submodule syncबाद में करने की आवश्यकता हो सकती है , लेकिन मैं अभी जांच करने की स्थिति में नहीं हूं।


इसके कारण नया सबमॉड्यूल नाम एक नई प्रतिबद्धता के रूप में होता है न कि नाम बदलने के रूप में। लेकिन शायद यही वह तरीका है जो होना चाहिए?
लार्स टैकमैन

1
@ लार्स: पुराने सबमॉड्यूल डायरेक्टरी को भी हटाना सुनिश्चित करें!
कास्कैबेल

3

MacOs : जब मैं सबमॉडल फ़ोल्डर को लोअरकेस में बदलने के लिए VonC समाधान का उपयोग करना चाहता हूं Common:

git mv Common common

मुझे मिला

घातक: 'सामान्य' का नाम बदलना विफल: अमान्य तर्क

समाधान - कुछ अस्थायी फ़ोल्डर नाम का उपयोग करें और दो बार स्थानांतरित करें:

git mv Common commontemp
git mv commontemp common

बस इतना ही :)

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