सबमॉडल्स सहित "क्लोन क्लोन" कैसे करें?


1988

मैं एक रेपो में सबमॉड्यूल लगाने की कोशिश कर रहा हूं। समस्या यह है कि जब मैं मूल रेपो को क्लोन करता हूं, तो सबमॉड्यूल फ़ोल्डर पूरी तरह से खाली होता है।

क्या इसे बनाने का कोई तरीका है जिससे git clone parent_repoवास्तव में सबमॉड्यूल फ़ोल्डर में डेटा डाला जाए?

उदाहरण के लिए, http://github.com/cwolves/fterelize/tree/master/lib/ , nodejs-mysql-nativeएक बाहरी गिट सबमॉड्यूल की ओर इशारा कर रहा है, लेकिन जब मैं sequelizeप्रोजेक्ट की जांच करता हूं , तो वह फ़ोल्डर खाली होता है।


4
यह आदेश होगा git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): यह क्लोन करेगा और सबमॉड्यूल को एक कमांड में अपडेट करेगा । देखें नीचे मेरी संपादित जवाब
VonC

जवाबों:


2974

Git और बाद के संस्करण 2.13 के साथ, --recurse-submodulesइसका उपयोग किया जा सकता है --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

संपादक का नोट: -j8एक वैकल्पिक प्रदर्शन अनुकूलन है जो संस्करण 2.8 में उपलब्ध हो गया, और समानांतर में एक समय में 8 सबमॉड्यूल तक प्राप्त होता है - देखें man git-clone

संस्करण 2.12 तक -jध्वज के संस्करण 1.9 के साथ ( केवल संस्करण 2.8+ में उपलब्ध ध्वज):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Git के संस्करण 1.6.5 के साथ और बाद में, आप इसका उपयोग कर सकते हैं:

git clone --recursive git://github.com/foo/bar.git
cd bar

पहले से क्लोन किए गए रेपो या पुराने Git संस्करणों के लिए, उपयोग करें:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

122
क्या इस व्यवहार को आपके गिट रिपॉजिटरी में डिफ़ॉल्ट के रूप में निर्दिष्ट करने का कोई तरीका है, ताकि कम-सूचित क्लोनर्स स्वचालित रूप से एक प्रारंभिक सबमॉड्यूल प्राप्त कर सकें?
NHDaly

11
@NHDaly अफसोस की बात है, नहीं। (ऐसा नहीं है कि मुझे पता है, कम से कम।)
मथियास बीनेंस

6
और तार्किक रूप से सोच-विचार करने वाला क्लोन - क्रेसीसिव भी एक सबमॉड्यूल के किसी भी सबमॉड्यूल्स को आबाद करेगा, है ना?
जयरोज़ो

3
@NHDaly ऐसा नहीं लगता है: stackoverflow.com/questions/4251940/…
Ciro Santilli 审查 seems seems seems

5
@toszter: क्या यह इतना बुद्धिमान है? क्या होगा अगर होल्डिंग रेपो को एक सबमॉडल के एक संस्करण की आवश्यकता होती है जो नहीं है master ?
गौथियर

498

सबमॉडल भरने से पहले आपको दो काम करने होंगे:

git submodule init 
git submodule update

8
मैं इससे डर गया था ... इसका कोई मतलब नहीं है क्योंकि आप उस मामले में एक आंशिक परियोजना की जाँच कर रहे हैं। मैं समझता हूँ कि सबमॉड्यूल अपडेट स्वचालित नहीं हैं, लेकिन बाउंड संस्करण स्वचालित रूप से जाँच क्यों नहीं किया जाता है ?? क्या इसे मजबूर करने का कोई तरीका है? मेरे पास 3-लेवल के सबमॉडल्स के साथ एक प्रोजेक्ट है और अब तक सिर्फ चेकआउट करना ही टेढ़ी खीर है।
मार्क

10
कृपया git-submodule(1)आदमी पृष्ठ ( kernel.org/pub/software/scm/git/docs/git-submods.html ) पढ़ें । आपको पता चलेगा कि git submodule updateनामक एक अच्छे पैरामीटर का समर्थन करता है --recursive
जोशी

94
सिर्फ एक आदेश में दोनों क्यों नहीं? git submodule update --init( मेरा उत्तर भी देखें )।
मैथियास ब्यनेंस

9
मैं इन दोनों आदेशों के साथ सवाल का जवाब देना बेहतर समझता हूं। यह बेहतर समझाता है कि कार्य को कैसे पूरा किया जाए।
शमीजोस

6
@MathiasBynens एक मशीन जिसे मैंने अभी लॉग किया है, उसमें केवल 1.5.5.6 git है, जो जाहिरा तौर पर छोटे निर्देश का समर्थन नहीं करता है, लेकिन दो कमांड के रूप में इसका समर्थन करता है।
जैक पॉल्सन

220

Git 2.23 (Q3 2019): यदि आप अपने नवीनतम संशोधन में सबमॉडल्स को क्लोन और अपडेट करना चाहते हैं :

git clone --recurse-submodules --remote-submodules

यदि आप उन्हें उनके दर्ज SHA1 पर क्लोन करना चाहते हैं:

git clone --recurse-submodules

निचे देखो।


मूल उत्तर 2010

जैसा कि जोशी ने टिप्पणियों में उल्लेख किया है, git submoduleअब --recursiveविकल्प का समर्थन करता है (Git1.6.5 और अधिक)।

यदि --recursiveनिर्दिष्ट किया गया है, तो यह कमांड पंजीकृत सबमॉड्यूल्स में फिर से आ जाएगी, और किसी भी नेस्टेड सबमॉड्यूल्स को अपडेट करेगा।

इनिट भाग के लिए पुनरावर्ती रूप से गिट सबमॉडल्स के साथ कार्य करना देखें । अधिक के लिए समझाया गया
देखें ।git submodule

संस्करण 1.6.5 git के साथ और बाद में, आप –-recursiveविकल्प के साथ सुपर-प्रोजेक्ट को क्लोन करके स्वचालित रूप से ऐसा कर सकते हैं :

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

अपडेट २०१६, git २.: के साथ: " git submodules का उपयोग करके गति को कैसे तेज / समानांतर करें git clone --recursive? " देखें।

आप समानांतर में कई थ्रेड्स का उपयोग करके सबमॉड्यूल लाने की पहल कर सकते हैं।
उदाहरण के लिए:

git fetch --recurse-submodules -j2

इससे भी बेहतर, Git 2.23 (Q3 2019) के साथ, आप एक कमांड में उनकी ट्रैकिंग शाखा के लिए सबमॉड्यूल को क्लोन और चेकआउट कर सकते हैं!

देखें प्रतिबद्ध 4c69101 (19 मई 2019) द्वारा बेन Avison ( bavison)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 9,476,094 , 17 जून 2019)

clone: --remote-submodulesझंडा जोड़ें

जब उपयोग git clone --recurse-submodulesकरने से पहले किसी भी उपयोग के मामले के लिए --remoteअंतर्निहित git submodule updateकमांड पर एक स्विच पास करने का कोई तरीका नहीं था, जहां आप चाहते हैं कि सुपरप्रोजेक्ट में दर्ज SHA-1 के बजाय सबमॉड्यूल को उनके रिमोट-ट्रैकिंग शाखा पर चेक आउट किया जाए।

यह पैच इस स्थिति को ठीक करता है।
यह वास्तव में इस आधार पर भी गुजरता --no-fetchहै git submodule updateकि वे सबमॉड्यूल को केवल क्लोन किया गया है, इसलिए रिमोट से फिर से लाने से चीजें धीमी हो जाती हैं।

इसका मत:

--[no-]remote-submodules:

सभी सबमॉड्यूल्स जो क्लोन किए गए हैं, सुपरप्रोजेक्ट के रिकॉर्ड किए गए SHA-1 के बजाय सबमॉड्यूल को अपडेट करने के लिए सबमॉड्यूल की रिमोट-ट्रैकिंग शाखा की स्थिति का उपयोग करेंगे। पास --remoteकरने के बराबर git submodule update


3
इसलिए सबमॉडल्स, हुह के लिए उचित समर्थन जोड़ना शुरू करने में 14 साल लग गए। अद्यतन के लिए धन्यवाद! क्या होगा अगर मेरे पास पहले से ही सबमॉड्यूल्स के बिना और एक रिकॉर्ड किए गए SHA1 के बिना मुख्य रेपो का क्लोन है, और मैं प्रत्येक सबमॉड्यूल के नवीनतम संस्करण में खींचना चाहता हूं। क्या यह करने योग्य है?
वायलेट जिराफ़

1
@VioletGiraffe अगर उस क्लोन रिपोजिटरी में सबमॉड्यूल हैं, तो उसने "SHA1 रिकॉर्ड किया है"। और git submodule update --init --recursive --remoteउन्हें अपनी संबंधित शाखा की नवीनतम प्रतिबद्धताओं के लिए अद्यतन करना चाहिए। (पूर्व: stackoverflow.com/a/56981834/6309 )
VONC

1
एक उदाहरण के साथ स्पष्ट करता हूं: मेरे पास जीथब पर एक टेम्प्लेट प्रोजेक्ट है जो सबमॉड्यूल्स का उपयोग करता है, और मैंने इस टेम्पलेट रेपो में सबमॉडल्स के विशिष्ट संशोधनों की भी सराहना की। लेकिन जब मैं इस रेपो से बाहर एक नया प्रोजेक्ट बनाता हूं, तो आपके द्वारा सूचीबद्ध कोई भी कमांड (न तो ) clone --recurse-submodules --remote-submodulesऔर न ही submodule update --init --recursive --remoteमुझे वास्तव में सबप्रॉप्ट लाने देता है। मुझे जो कुछ भी मिलता है वह एक .itmodules फ़ाइल होती है, और मैं सबप्रॉप्ट्स को मैन्युअल रूप से एक-एक करके क्लोन करने के अलावा किसी अन्य तरीके से नहीं ढूंढ सकता। मैं कम से कम एक स्क्रिप्ट के साथ इसे करना चाहूंगा submodule foreach...
वायलेट जिराफ

यदि आप कोई समाधान जानते हैं, तो मैं एक अलग सवाल पूछूंगा जिसका आप जवाब दे सकते हैं। यहाँ परीक्षण रेपो है कि मैं हाथ के अलावा अन्य किसी भी तरह का init नहीं ढूँढ सकता हूँ: github.com/VioletGiraffe/TEST
Violet जिराफ़

@VioletGiraffe इसलिए है क्योंकि आपने .itmodules को जोड़ा और प्रतिबद्ध किया है, लेकिन gitlink ( stackoverflow.com/a/16581096/6309 , इंडेक्स में विशेष प्रविष्टियाँ: stackoverflow.com/a/19354410/6309 ) यहाँ एक रिपॉजिटरी नहीं है जो करता है उचित gitlink पंजीकृत है: github.com/tiagomazzutti/antlr4dart
VonC

108

[शीघ्र जवाब]

आप सभी सबमॉड्यूल के साथ अपने रेपो को क्लोन करने के लिए इस कमांड का उपयोग कर सकते हैं:

git clone --recursive YOUR-GIT-REPO-URL

या यदि आपने पहले ही परियोजना का क्लोन बना लिया है, तो आप उपयोग कर सकते हैं:

git submodule init
git submodule update

33

यदि आपका सबमॉड्यूल एक शाखा में जोड़ा गया है, तो इसे अपने क्लोन कमांड में शामिल करना सुनिश्चित करें ...

git clone -b <branch_name> --recursive <remote> <directory>

यह वैसा ही था जैसा मैं ढूंढ रहा था ... लेकिन सबमॉड्यूल्स उनकी शाखा को 'अलग' कर देते हैं। :(
AceFunk

28

इसे इस्तेमाल करे:

git clone --recurse-submodules

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


37
ध्यान दें कि --recurse-submodulesऔर --recursiveकर रहे हैं बराबर उपनाम
जोएल Purra

@SuperUberDuper उस मामले में git submodule update --init --recursiveजैसा कि आप इस उत्तर
एनरिको


21

देर से जवाब

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

जैसा कि मैंने अभी एक दोस्त के साथ पूरे एक घंटे का समय बिताया है: भले ही आपके पास BitBucket पर व्यवस्थापक अधिकार हैं, हमेशा ORIGINAL रिपॉजिटरी को क्लोन करें और रेपो के मालिक के पासवर्ड का उपयोग करें। यह पता लगाने के लिए कि आप इस मीनार में भाग गए हैं: पी


ठीक यही मैं काम कर रहा हूं। तो, क्या आप कह रहे हैं कि जिस किसी को भी बिटकॉइन रिपॉजिटरी में विकसित करने की आवश्यकता है, जिसके पास सबमॉड्यूल है, रिपॉजिटरी निर्माता के क्रेडेंशियल्स का उपयोग करना चाहिए? Blech।
jsleuth

@jsleuth ऐसा लगता है - यह बड़े समय बेकार है ... और मुझे पता है।
केसर

यह एक बग की तरह लगता है। क्या आपने इसे बिटकॉइन की सूचना दी?
मथियास ब्यनेंस 19

@MathiasBynens क्या आपने इस मुद्दे पर ठोकर खाई? यह डेढ़ साल बाद है और मैं वास्तव में नहीं जानता कि क्या यह अभी भी मामला है।
कैसर

4
यह ओपीटी प्रश्न का वर्णन नहीं करता है, लेकिन बिटबकेट में एक असंबंधित बग का विवरण देता है; जो, संयोग से, "SSH कुंजी प्रमाणीकरण का उपयोग करने के लिए" छोटा किया जा सकता है।
ट्रेफिनॉन

18

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

git clone -b <branch_name> --recursive <remote> <directory>

या

git clone --recurse-submodules

18

--recursiveरिपॉजिटरी को क्लोन करते समय आप ध्वज का उपयोग कर सकते हैं । यह पैरामीटर रिपॉजिटरी में सभी परिभाषित सबमॉड्यूल को क्लोन करने के लिए बाध्य करता है।

git clone --recursive git@repo.org:your_repo.git

क्लोनिंग के बाद, कभी-कभी सबमॉड्यूल शाखाएं बदली जा सकती हैं, इसलिए इसके बाद यह कमांड चलाएं:

git submodule foreach "git checkout master"

17

[शीघ्र जवाब]

माता-पिता रेपो (जिसमें कुछ सबमॉडल रेपो शामिल थे) का क्लोन बनाने के बाद, निम्न कार्य करें:

git submodule update --init --recursive

11

सबमॉड्यूल्स समानांतर भ्रूण का उद्देश्य एक बार में कई रिपॉजिटरी को लाने में सक्षम करके एक रिपॉजिटरी और उसके सभी संबंधित सबमॉडल लाने के लिए आवश्यक समय को कम करना है। यह नए-विकल्प विकल्प का उपयोग करके पूरा किया जा सकता है, जैसे:

git fetch --recurse-submodules --jobs=4

Git टीम के अनुसार, यह रिपॉजिटरी को अद्यतन करने में काफी तेजी ला सकता है जिसमें कई सबमॉड्यूल होते हैं। जब -recurse-submodules का उपयोग नए नए विकल्प के बिना करते हैं, तो Git एक-एक करके सबमॉड्यूल्स लाएगा।

स्रोत: http://www.infoq.com/news/2016/03/git28-released


8

मुझे GitHub रिपॉजिटरी के लिए एक ही समस्या थी। मेरा खाता SSH कुंजी गायब था। प्रक्रिया है

  1. SSH कुंजी उत्पन्न करें
  2. अपने GitHub खाते में एक नई SSH कुंजी जोड़ना

फिर, आप सबमोडुल्स ( git clone --recursive YOUR-GIT-REPO-URL) के साथ रिपॉजिटरी को क्लोन कर सकते हैं

या

भागो git submodule initऔर git submodule updateपहले से क्लोन भंडार में सबमॉड्यूल्स लाने के लिए।


हाँ, वह यह है कि Permission denied (publickey). fatal: Could not read from remote repository.त्रुटि
Ender

5

इसे इस्तेमाल करे।

git clone -b <branch_name> --recursive <remote> <directory>

यदि आपने एक शाखा में सबमॉड्यूल जोड़ा है, तो सुनिश्चित करें कि आप इसे क्लोन कमांड में जोड़ते हैं।


5

यदि यह एक नया प्रोजेक्ट है तो बस आप ऐसा कर सकते हैं:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

यदि यह पहले से स्थापित है:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.