मैं एक git सबमॉड्यूल को दूसरे रेपो के साथ कैसे बदलूं?


96

मैं एक git सबमॉड्यूल को एक अलग git रेपो के साथ कैसे बदलूं?

विशेष रूप से, मेरे पास एक सबमॉड्यूल है:

  • ./ExternalFrameworks/TestFrameworkएक गिट रेपो के लिए उस बिंदु पर स्थित हैgit@github.com:userA/TestFramework.git
  • मैं इसे अब इंगित करना चाहता हूं git@github.com:userB/TestFramework.git

समस्या यह है कि जब मैं यहां वर्णित विधि के साथ सबमॉड्यूल हटाता हूं , तो कमांड का उपयोग करके इसे फिर से जोड़ें

git submodule add git@github.com:userB/TestFramework.git

मुझे यह त्रुटि मिली:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.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.

जवाबों:


123

यदि सबमॉडल का स्थान (URL) बदल गया है, तो आप बस:

  1. .gitmoduleनए URL का उपयोग करने के लिए अपनी फ़ाइल को संशोधित करें
  2. रेपो में सबमॉड्यूल फोल्डर को डिलीट करें rm -rf .git/modules/<submodule>
  3. कार्य निर्देशिका में सबमॉड्यूल फ़ोल्डर हटाएं rm -rf <submodule>
  4. Daud git submodule sync
  5. Daud git submodule update

अधिक पूरी जानकारी कहीं और मिल सकती है:


4
यह भी ध्यान देने योग्य है: जब कोई अन्य उपयोगकर्ता (जो पहले से ही सबमॉड्यूल में शामिल था) को आपका अपडेट मिल जाता है, तो उन्हें "गिट सबमॉड्यूल सिंक" भी करना होगा, जबकि नया सबमॉड्यूल उनके लिए एक बार पहले काम करेगा।
joseph.hainline

2
इसने मेरे लिए काम नहीं किया। मेरे सबमॉडल ने इसके बाद भी पुराने URL को इंगित किया। कोई विचार क्यों?
Arne

34
@Arne हो सकता है कि आपका सबमॉडल कभी भी ठीक से इनिशियलाइज़ न हुआ हो। मुझे rm -rf .git/modules/<submodule>इससे पहले कि मेरे लिए काम करना था।
डेविड ब्रौन

हालांकि कर @DavidBraun मैं @Arne रूप में एक ही समस्या है git submodule syncके बाद rm -rf .git/modules/<submodule>देता है fatal: Not a git repository: ../.git/modules/<submodule>। कोई सुझाव? मैंने शुरू git submodule add https://<submodule-url>में git डॉक्स के माध्यम से
सबमॉड्यूल बनाया

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

34

सबसे पहले, विधि पहले ही उल्लेख के साथ वर्तमान submodule हटाना यहाँ जो मैं सुविधा के लिए शामिल कर रहा हूँ,:

  • .gitmodulesफ़ाइल से संबंधित अनुभाग हटाएं
  • से संबंधित अनुभाग हटाएं .git/config
  • रन git rm --cached path_to_submodule(कोई अनुगामी स्लैश)
  • अब अनियंत्रित सबमॉड्यूल फ़ाइलों को कमिट करें और हटाएं

अब, --nameध्वज के साथ नया सबमॉड्यूल जोड़ें । यह .git/configऐतिहासिक रूप से वहां मौजूद सबमॉडल के साथ निर्णय लेने के लिए, सबमॉडल के संदर्भ के लिए एक वैकल्पिक नाम देगा , जिसे आप अभी भी अपने पूर्व इतिहास में काम करना चाहते हैं।

तो टाइप करें:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

और आपको वह सबमॉड्यूल मिलेगा, जिसकी आप उम्मीद करते हैं।


2
जबकि यह तरीका काम करता है, यह टिम के तरीके की तरह साफ नहीं है।
joseph.hainline

4
इसने मेरे लिए काम किया लेकिन मुझे भी हटाना पड़ा .git/modules/<path_to_submodule>
नैट

1
के संदर्भ की सराहना करते हैं --name। मुझे इसके आसपास के मुद्दों के बारे में पता नहीं था, और जब तक मैंने इस विकल्प का उपयोग नहीं किया तब तक मैं एक सबमॉड्यूल को बदलने में सक्षम नहीं था (आपके उत्तर के लिए धन्यवाद)।
एकन्यूड्स

यह एकमात्र तरीका है जो मेरे लिए काम करता है, लेकिन मैं उसी निर्देशिका का नाम रखना चाहता था। इसने सही रास्ता चेक किया और मॉड्यूल को वांछित नाम दिया लेकिन काम करने वाली निर्देशिका का नाम नया रेपो नाम था। इसलिए यदि आप एक ही नाम चाहते हैं, तो आपको यह भी निर्दिष्ट करना होगा कि url के अंत में इस प्रकार है:git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

ये कमांड स्थानीय रिपॉजिटरी पर किसी भी फाइल को बदले बिना कमांड प्रॉम्प्ट पर काम करेंगे।

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote

5

मेरे लिए यह तय किया गया था कि आपके git रेपो (सबमॉडल नहीं) की जड़ में है, भागो

rm -rf .git/modules/yourmodule

फिर आपको सामान्य रूप से जोड़ने में सक्षम होना चाहिए।


3

सबसे आसान तरीका जो मुझे मिला वह यह है:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

मुझे अपने आप को संशोधित करने का विचार पसंद नहीं आया .gitmodules। मैंने इसके बारे में थोड़ा ब्लॉगपोस्ट भी लिखा था ।


2

यदि आप केवल इस क्लोन के लिए दूरस्थ URL बदलना चाहते हैं :

git config submodule."$submodule_name".url "$new_url"

यह .gitmodulesमूल प्रोजेक्ट में फ़ाइल को प्रभावित नहीं करेगा , इसलिए इसे अन्य डेवलपर्स के लिए प्रचारित नहीं किया जाएगा।

इसे यहां "उपयोगकर्ता विशिष्ट रिकॉर्ड परिवर्तन" के रूप में वर्णित किया गया है

चलाने केgit submodule syncरूप में है कि सामान्य यूआरएल के लिए फिर से सेट हो जाएंगे।

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