Git सबमॉड्यूल के लिए दूरस्थ रिपॉजिटरी को कैसे बदलें?


722

मैंने इसमें एक सबमॉडल के साथ एक git रिपॉजिटरी बनाई है। मैं अपने दूरस्थ रिपॉजिटरी पथ को बदलने के लिए सबमॉडल को स्वयं बताने में सक्षम हूं, लेकिन मुझे यकीन नहीं है कि माता-पिता के रिपॉजिटरी को कैसे बताया जाए कि कैसे सबमॉडल के लिए रिमोट रिपॉजिटरी पथ को बदला जाए।

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


8
नोट: Git 2.25 (Q1 2020) एक नई कमांड के साथ आता है :git submodule set-url [--] <path> <newurl>
VonC

जवाबों:


1010

आपको .gitmodulesURL को अपडेट करने के लिए फ़ाइल को संपादित करने में सक्षम होना चाहिए और फिर git submodule syncउस परिवर्तन को सुपरप्रोजेक्ट और अपनी कार्यशील प्रतिलिपि में प्रतिबिंबित करना होगा।


22
यह कम से कम 1.7.1 या 1.7.3 में .git / config को अपडेट करने के लिए प्रतीत नहीं होता है।
davidtbernal

6
क्या यह पिछले कमिट्स के लिए सबमॉड्यूल url कॉन्फ़िगरेशन को भी अपडेट करता है? पूर्व यदि मैं एक पुरानी प्रतिबद्ध जांच करता हूं, तो क्या यह नए सबमॉड्यूल के संकेत देगा?
मैक्सिमबिन

62
git submodule foreach -q git config remote.origin.url"वास्तविक"
सबमॉड्यूल के

9
यह .git/configमेरे लिए 2.1.0 git का उपयोग कर अद्यतन नहीं किया । मुझे अपने सबमॉडल रिमोट को अपडेट करने के लिए चलाने से पहले दोनों को .gitmodulesऔर .git/configमैन्युअल रूप से git submodule sync --recursiveअपडेट करना था।
डेसिम

7
यह महत्वपूर्ण कदम याद आ रहा है, git submodule update --init --recursive --remoteजो वास्तव में भंडार को नए रिमोट में बदल देता है
जेसन एक्सेलसन

154

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

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

कृपया स्क्रीनशॉट के लिए ब्लॉग देखें: GIT सबमॉडल्स URL / शाखा को अन्य URL / उसी रिपॉजिटरी की शाखा में बदलना


8
यह काम किया लेकिन मुझे रिमोट में बदलाव को आगे बढ़ाने के लिए याद रखना था। git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
खैर, इसने मेरे लिए एक भयानक गड़बड़ पैदा कर दी। कमांड चुपचाप नीचे चले गए, लेकिन वास्तविक सबमॉड्यूल रिपॉजिटरी को अब भी लगता है कि इसका रिमोट पुराना (पुराना URL) है। हो सकता है कि इन आदेशों को सबमॉड्यूल के भंडार के भीतर अन्य आदेशों के साथ होना चाहिए?
मोति श्नोर

5
अंतिम कमांड थोड़ा चरम है ... यदि आपके पास सबमॉड्यूल्स के साथ सबमॉड्यूल्स हैं, तो यह उप-सबमॉडल्स को दूरस्थ रूप से अपडेट करेगा, जो कि आपकी ज़रूरत नहीं है।
बैप्टिस्ट विच

7
ध्यान दें कि आपको अपने सबमॉडल के नाम के साथ सबमॉड को बदलने की आवश्यकता है!
शीतल शाह

133

सरल शब्दों में, आपको केवल .gitmodules फ़ाइल को संपादित करना होगा, फिर resync और अपडेट करना होगा:

फ़ाइल को संपादित करें, या तो git कमांड के माध्यम से या सीधे:

git config --file=.gitmodules -e

या केवल:

vim .gitmodules

फिर resync और अपडेट करें:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initमेरे लिए काम किया, --remoteलगता है कि इसे दूरस्थ रेपो के सिर से बांध दिया जाए।
चैम एलियाह

95

2.25 Git (Q1 2020) के साथ, आप इसे संशोधित कर सकते हैं।
" गिट सबमॉडल url बदल गया " और नया कमांड देखें

git submodule set-url [--] <path> <newurl>

मूल उत्तर (मई 2009, दस साल पहले)

दरअसल, भूमिका को स्पष्ट करने के लिए अप्रैल 2009 में एक पैच प्रस्तुत किया गया हैgitmodule

तो अब gitmodule प्रलेखन में अभी तक शामिल नहीं है:

.gitmodulesGit-config: फ़ाइल, एक Git काम कर पेड़ के शीर्ष-स्तरीय निर्देशिका में स्थित, आवश्यकताओं के- linkgit मिलान एक वाक्य रचना के साथ एक पाठ फ़ाइल है 1
[NEW]:
जैसे ही यह फ़ाइल Git द्वारा प्रबंधित की जाती है, यह किसी प्रोजेक्ट के सबमॉड्यूल के + रिकॉर्ड को ट्रैक करती है।
इस फ़ाइल में संग्रहीत जानकारी प्रोजेक्ट कॉन्फ़िगरेशन फ़ाइल में संग्रहीत रिकॉर्ड के आधिकारिक संस्करण को प्राइम करने के संकेत के रूप में उपयोग की जाती है।
उपयोगकर्ता विशिष्ट रिकॉर्ड परिवर्तन (उदाहरण के लिए नेटवर्किंग स्थितियों के कारण सबमॉड्यूल URL में अंतर के लिए खाता) कॉन्फ़िगरेशन फ़ाइल के लिए किया जाना चाहिए, जबकि रिकॉर्ड परिवर्तन प्रचारित किया जाना चाहिए (जैसे + सबमॉड्यूल स्रोत के स्थानांतरण के कारण) इस फ़ाइल में किया जाना चाहिए ।

यह बहुत जिम के जवाब की पुष्टि करता है ।


यदि आप इस git सबमॉड्यूल ट्यूटोरियल का अनुसरण करते हैं, तो आपको git submodule init.it / config में सबमॉड्यूल रिपॉजिट URL को जोड़ने के लिए " " की आवश्यकता है ।

" git submodule sync" अगस्त 2008 में जोड़ा गया है कि URL को बदलने पर उस कार्य को आसान बनाने के लिए (विशेषकर यदि सबमॉड्यूल की संख्या महत्वपूर्ण है)।
उस कमांड के साथ सहयोगी स्क्रिप्ट काफी सरल है:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

लक्ष्य रहता है: git config remote."$remote".url "$url"


मैं इस मशीन पर केवल सबमॉड्यूल का URL बदलना चाहता था। मूल परियोजना से मैं रिकॉर्ड को संशोधित कर सकता है .git/config: git config submodule."$submodule_name".url "$new_url" जिसे यहाँ भी वर्णित किया गया है
joeytwiddle

वैकल्पिक डबल डैश क्या करता git submodule set-url [--] <path> <newurl>है?
jeverling

1
@ ज्वरलिंग वे मापदंडों से अलग विकल्पों में मदद करते हैं: देखें stackoverflow.com/a/1192194/6309
VONC

1
ध्यान दें कि उबंटू उपयोगकर्ताओं के लिए पुराने संस्करण के साथ आप इस PPA को अपडेट करने के लिए उपयोग कर सकते हैं: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs

69

मेरे लिए क्या काम किया (विंडोज पर, git संस्करण 1.8.3.msysgit.0 का उपयोग करके):

  • नई रिपॉजिटरी के पथ के साथ .itmodules को अपडेट करें
  • ".Git / config" फ़ाइल से संबंधित पंक्ति निकालें
  • ".गित / मॉड्यूल / बाहरी" निर्देशिका में संबंधित निर्देशिका हटाएं
  • चेक किए गए सबमॉड्यूल निर्देशिका को हटाएं (यदि यह आवश्यक है तो अनिश्चित करें)
  • भागो git submodule initऔरgit submodule update
  • सुनिश्चित करें कि चेक किया गया सबमॉडल सही कमिट पर है, और कमिट करें, क्योंकि यह संभावना है कि हैश अलग होगा

वह सब करने के बाद, राज्य में वह सब कुछ है जिसकी मुझे उम्मीद थी। मुझे लगता है कि रिपॉजिटरी के अन्य उपयोगकर्ताओं को इसी तरह का दर्द होगा जब वे अद्यतन करने के लिए आते हैं - लेकिन यह आपके बुद्धिमान संदेश में इन चरणों को समझाने के लिए बुद्धिमान होगा!


2
इस के लिए बहुत बहुत धन्यवाद। यह केवल एक है जो मेरे लिए काम करने के बाद मैंने पहले ही चला दिया था git submodule update। अन्य उत्तरों के बाद यह नहीं बदलेगा कि क्या ./git/modules/externalअद्यतन करने का प्रयास किया जा रहा था, इसके परिणामस्वरूप परिणाम अभी भी गलत यूआरएल को खींच रहा है।
NtscCobalt

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

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

@MottiShneor जो वास्तव में खतरनाक लगता है यदि आपको पिछले सबमॉड्यूल इतिहास को रखने की आवश्यकता है, हालांकि मुझे इसके बारे में निश्चित नहीं है। मेरे मामले में यह एकमात्र समाधान है जो काम करता है, जो मैं चाहता था वह मूल रूप से अपने स्वयं के कांटे के साथ मूल
सबमॉड्यूल को

1
इन चरणों का पालन किया और पाया कि "
हटाए गए सबमॉड्यूल

10

बस अपनी .it / config फ़ाइल संपादित करें । उदाहरण के लिए; यदि आपके पास "सामान्य" सबमॉड्यूल है तो आप इसे सुपर-मॉड्यूल में कर सकते हैं:

git config submodule.common.url /data/my_local_common

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

4

git config --file=.gitmodules -e डिफ़ॉल्ट संपादक खोलता है जिसमें आप पथ को अपडेट कर सकते हैं

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