मैं एक उप-निर्देशिका में एक सबमॉड्यूल कैसे जोड़ूं?


309

मेरे पास इसमें सबमॉड्यूल्स ~/.janus/के एक समूह के साथ एक गिट रेपो है। मैं एक सबमॉड्यूल जोड़ना चाहता हूं ~/.janus/snipmate-snippets/snippets/, लेकिन जब मैं निर्देशिका git submodule add <git@github.com:...>में भाग लेता हूं snipmate-snippets, तो मुझे निम्न त्रुटि संदेश मिलता है:

You need to run this command from the toplevel of the working tree.

तो सवाल यह है: मैं snipmate-snippetsनिर्देशिका में एक सबमॉड्यूल कैसे जोड़ूं ?


सबमॉड्यूल कमांड्स के लिए git रेपो की रूट डायरेक्टरी में जाने की अब (जल्द ही) जरूरत नहीं होगी। देखें नीचे मेरा उत्तर
VonC

3
git submodule add -b <branch> <url> <relative_path_4m_root>
पैराश्री

जवाबों:


437

तुम जाओ ~/.janusऔर भागो:

git submodule add <git@github ...> snipmate-snippets/snippets/

यदि आपको सबमॉड्यूल (या सामान्य रूप से गिट ) के बारे में अधिक जानकारी की आवश्यकता है, तो ProGit बहुत उपयोगी है।


यह जोड़ने के लिए एक अच्छा विचार है कि शाखा को जोड़ने पर अन्यथा HEAD आसानी से अलग हो जाता है: git सबमॉड्यूल ऐड -b <शाखा> <repository> [<submodule-path>]
deann

1
मेरे लिए यह कारण था 'subprojects' already exists in the index (मैं निर्देशिका नाम के रूप में उपप्रोजेक्ट का उपयोग कर रहा था) । इसके बजाय क्या मदद मिली, नीचे VONC का जवाब है, यानी कर रहा है cd subprojects, और फिर git submodule add <get@github …>पथ के बिना।
हाय-एंजेल

83

ध्यान दें कि git1.8.4 (जुलाई 2013) शुरू होने पर , आपको अब रूट निर्देशिका में वापस नहीं जाना होगा।

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Bouke Versteegh टिप्पणी आप का उपयोग करने की जरूरत नहीं है कि /., के रूप में में snippets/.: snippetsपर्याप्त है)

देखें प्रतिबद्ध 091a6eb0feed820a43663ca63dc2bc0bb247bbae :

सबमॉड्यूल: शीर्ष स्तर की आवश्यकता को छोड़ दें

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

चूँकि किसी सापेक्ष सबमॉडल URL की व्याख्या इस बात पर निर्भर करती है कि " remote.origin.url" कॉन्फ़िगर किया गया है या नहीं , तो स्पष्ट रूप git submodule addसे कार्यशील पेड़ के शीर्ष स्तर पर नहीं " " में सापेक्ष URL को ब्लॉक करें ।

साइन-ऑफ-बाय: जॉन कीपिंग

12b9d32790b40bf3ea49134095619700191abf1 पर प्रतिबद्ध निर्भर करता है

यह ' git rev-parse' व्यवहार करता है जैसे कि यह एक रिपॉजिटरी के निर्दिष्ट उपनिर्देशिका से आमंत्रित किया गया था, इस अंतर के साथ कि किसी भी फ़ाइल पथ जो यह प्रिंट करता है, वह कार्यशील पेड़ के शीर्ष से पूर्ण पथ के साथ उपसर्ग करता है

यह शेल स्क्रिप्ट के लिए उपयोगी है जहाँ हम cdकाम करने वाले पेड़ के शीर्ष पर चाहते हैं, लेकिन कमांड लाइन पर उपयोगकर्ता द्वारा दिए गए सापेक्ष पथ को संभालने की आवश्यकता होती है।


बहुत धन्यवाद! मैंने देखा कि अनुगामी /.आवश्यक नहीं है, गिट इसके बिना निर्देशिका स्निपेट्स बनाएगा।
बुके वेरस्टीघ

@BoukeVersteegh दिलचस्प। अधिक दृश्यता के जवाब में मैंने आपकी टिप्पणी को शामिल किया है।
VONC

मैं git संस्करण 2.7.4 पर हूं लेकिन फिर भी मुझे यह त्रुटि संदेश मिल रहा है Relative path can only be used from the toplevel of the working tree। मैं कर रहा हूँgit submodule add ../../../functest
फ्लाइंगअुरा

@ user3426358 हाँ, यह अपेक्षित है: मुख्य उपयोक्ता के किसी भी सबफ़ोल्डर से git सबमॉड्यूल जोड़ने की क्षमता के बारे में os से ऊपर का उत्तर, न कि उसके मूल फ़ोल्डर से। यह एक रिश्तेदार पथ के साथ सबमॉड्यूल रिमोट रेपो को संदर्भित करने के बारे में नहीं है। यदि आप करते हैं, तो आपको त्रुटि संदेश मिलेगा जो आप देखते हैं।
वॉन

@ user3426358 और वैसे, कि त्रुटि संदेश (जो आप देखते हैं: " Relative path can only be used from the toplevel of the working tree") है नहीं (मूल प्रश्न से एक " You need to run this command from the toplevel of the working tree")
VonC

17

मेरे पास एक समान मुद्दा था, लेकिन अपने आप को जीयूआई उपकरणों के साथ एक कोने में चित्रित किया था।

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

इस झंझट से बाहर निकलने के लिए मुझे Git को सबफ़ोल्डर को ट्रैक करने से रोकने के लिए (फ़ाइलों को हटाने के बिना) बताना पड़ा :

proj> git rm -r --cached ./ui/jslib

फिर मुझे यह बताना पड़ा कि वहां एक सबमॉडल था (जो आप नहीं कर सकते हैं अगर वर्तमान में गिट द्वारा ट्रैक किया जा रहा है तो कुछ भी नहीं):

proj> git submodule add ./ui/jslib

अपडेट करें

इसे संभालने का आदर्श तरीका कुछ और कदम शामिल हैं। आदर्श रूप से, मौजूदा रेपो को अपनी निर्देशिका में स्थानांतरित कर दिया जाता है, किसी भी माता-पिता के मॉड्यूल से मुक्त, प्रतिबद्ध और धक्का दिया जाता है, और फिर इस तरह एक सबमॉड्यूल के रूप में जोड़ा जाता है:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

जो कि git repo को एक सबमॉड्यूल के रूप में क्लोन करेगा - जिसमें मानक क्लोनिंग स्टेप्स शामिल हैं, लेकिन कई अन्य अधिक अस्पष्ट कॉन्फिग स्टेप्स भी हैं जो git आपकी तरफ से उस सबमॉड्यूल को काम करने के लिए लेता है। सबसे महत्वपूर्ण अंतर यह है कि यह एक .गित निर्देशिका के बजाय एक साधारण .गित फ़ाइल को रखता है, जिसमें एक पथ संदर्भ होता है, जहां वास्तविक git dir रहता है - आमतौर पर मूल प्रोजेक्ट रूट .गित / मॉड्यूल / jslib।

यदि आप इस तरह से चीजें नहीं करते हैं तो वे आपके लिए ठीक काम करेंगे, लेकिन जैसे ही आप माता-पिता के लिए प्रतिबद्ध होते हैं और धक्का देते हैं, और एक और देव उस माता-पिता को खींचने के लिए जाता है, आपने बस अपने जीवन को बहुत कठिन बना दिया है। आपके लिए आपके मशीन पर आपके द्वारा बनाए गए ढांचे को तब तक दोहराना बहुत मुश्किल होगा जब तक आपके पास एक डायर के सबफ़ोल्डर में एक पूर्ण .गित डायर होता है जिसमें उसका अपना .गित डायर होता है।

तो, चाल, धक्का, गिट सबमॉडल जोड़ें, सबसे साफ विकल्प है।


16

आप में से जो मैन्युअल रूप से संपादन फ़ाइलों को जोड़ने के अपने अजीब शौक को साझा करते हैं, उन्हें जोड़ने (या संशोधित) के बाद भी चाल चलेगी।

.it / config (व्यक्तिगत कॉन्फ़िगरेशन)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.itmodules (प्रतिबद्ध साझा कॉन्फ़िगरेशन)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

इसे भी देखें - .itmodules और .it / config में submodules निर्दिष्ट करने के बीच अंतर?


2

एक-लाइनर बैश स्क्रिप्ट, क्रिस के उत्तर की सुविधा में मदद करने के लिए, जैसा कि मैंने खुद को एक कोने में चित्रित किया था और साथ ही साथ अपने Ivim लिपियों के अपडेट को भी इस्तेमाल किया था। DESTआपके सबमॉडल्स वाली निर्देशिका का मार्ग है। ऐसा करने के बाद करेंgit rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

चियर्स

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