2011-05-17 12 views
34

मुझे एक गिट भंडार के साथ कुछ परेशानी है जिसमें कई submodules शामिल हैं।गिट submodules और एसएसएच पहुंच

सुपर Git भंडार आदेशों

mkdir projectname 
cd projectname 
git init 
git submodule add ssh://[email protected]/pathtorepos 

साथ निर्माण किया गया था किसी दूसरे उपयोगकर्ता ("otheruser") तो क्लोन जब सुपर भंडार सब कुछ बाहर काम करने लगता है। लेकिन

git submodule init 
git submodule update 

Git बजाय "otheruser" के "myusername" का उपयोग submodule क्लोन करने के लिए कोशिश करता है जब यह submodule तक पहुँच प्राप्त करने के लिए समय है।

इस समस्या को हल करने के लिए कैसे करें?

उत्तर

31

यदि संभव हो, यह सुनिश्चित करें कि .gitmodules फ़ाइल भंडार है कि किसी के द्वारा क्लोन किया जा सकता है, आम तौर पर या तो एक git:// या http:// URL के लिए एक URL होता है बनाने के लिए सबसे अच्छा है। तो उपयोगकर्ता उस SSH उपयोग कर सकते है खुद को submodule में क्लोनिंग के बाद remote.origin.url में अपने उपयोगकर्ता नाम के साथ एक SSH यूआरएल को इंगित करने के बदल सकते हैं और बदल सकते हैं यूआरएल, जैसे:

cd my-submodule 
git remote set-url origin [email protected]:/pathtorepos 

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

ध्यान दें कि .gitmodules में यूआरएल केवल तभी उपयोग किए जाते हैं जब सबमिशन प्रारंभ करना। सबमिशन शुरू करने से मुख्य परियोजना में कॉन्फ़िगरेशन मान submodule.<SUBMODULE-NAME>.url सेट करता है जो .gitmodules में जो कुछ भी किया गया है - यह वह मान है जिसका उपयोग पहले सबमिशन अपडेट पर किया जाएगा।

git config submodule.my-submodule.url [email protected]:/pathtorepos 

दरअसल, आप अगर पहले अद्यतन विफल रहता है यह करने के लिए आवश्यकता हो सकती है: आरंभ और submodule को अद्यतन करने के बीच, आप भी इस URL कि जैसी कमांड के साथ कि पहले अद्यतन के लिए उपयोग किया जाएगा बदल सकते हैं। एक बार जब सबमिशन को पहली बार अद्यतन किया गया है, तो आपको जिस यूआरएल को बदलने की जरूरत है वह सबमिशन के भीतर origin के लिए परिभाषित किया गया है - उस बिंदु पर यदि आप हटाना चाहते हैं तो मुख्य परियोजना में submodule.my-submodule.url कॉन्फ़िगरेशन मान सेट करना केवल उपयोगी है और सबमिशन फिर से अद्यतन।

+3

एसएसएच-आधारित यूआरएल का उपयोग '.gitmodules' ** में करना उचित है यदि ** ** उनमें उपयोगकर्ता नाम शामिल नहीं है (प्रत्येक अंतिम उपयोगकर्ता अपने स्वयं के सर्वर उपयोगकर्ता नाम प्रदान करने के लिए '.ssh/config' को कॉन्फ़िगर कर सकता है, यदि यह उनके स्थानीय उपयोगकर्ता नाम से अलग है)। दूसरा, 'गिट सबमिशन इनिट' '.gitmodules' से' .git/config' तक सबमिशन प्रविष्टियों की प्रतिलिपि बनाता है, इसलिए एक बिंदु ('init' के बाद, लेकिन 'गिट सबमिशन अपडेट' के पहले उपयोग से पहले), जहां आप क्लोन किए जाने से पहले एक सबमिशन के यूआरएल को फिर से कॉन्फ़िगर कर सकते हैं। यदि submodules पहले से ही आपके '(सीडी उप और& git config remote.origin.url ...) को क्लोन कर दिया गया है, तो भी (भी) आवश्यक है। –

+0

@ क्रिस जॉनसन: मैंने आपके पहले बिंदु के बारे में एक नोट जोड़ा है - धन्यवाद। मुझे बाद के बिंदु के बारे में काफी जानकारी है, लेकिन मैं सबमिड्यूल पर उत्तर रखने के लिए प्रयास करने की कोशिश कर रहा हूं, इसलिए वे सभी [रैंपिंग ब्लॉग पोस्ट] में नहीं आते हैं (http://longair.net/blog/2010/06/02/गिट-सबोड्यूल्यूल-समझाया गया /) सभी अलग-अलग राज्यों के बारे में आपके सबमिड्यूल में हो सकता है ... वैसे भी, मैं इस स्थिति को उस स्थिति का वर्णन करने के लिए भी अपडेट करूंगा :( –

+0

ठीक है, मुझे आशा है कि यह बेहतर होगा अब –

8

अन्य उपयोगकर्ता को उपयोगकर्ता नाम को अपने उपयोगकर्ता नाम में बदलने के लिए .git/config फ़ाइल को बदलना है। इस तरह, गिट सर्वर से कनेक्ट करने के लिए सही उपयोगकर्ता का उपयोग करता है।

[submodule "path/to/module"] 
    url = ssh://[email protected]/pathtorepos 
2

बस संदर्भ के लिए, मैं जिस समाधान का उपयोग कर समाप्त हुआ वह निम्नलिखित है। दूसरों के लिए मौजूदा भंडार की जांच करना वास्तव में संभव है।

जब मैं भंडार यह आदेशों

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git submodule init 
git submodule update 

साथ किया जा सकता की जाँच करने के लिए दूसरों सुपर भंडार की जाँच करने के लिए की जरूरत है, आदेश के निम्नलिखित सेट किया जाता है। फर्क सिर्फ इतना है अन्य भंडार के मैनुअल क्लोनिंग

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git clone ssh://[email protected]/path/to/other/repos 
git submodule init 
git submodule update 

ध्यान दें कि

git submodule init 

आदेश जारी करने के बाद, Git आपको बता देंगे कि अनुरोध किया भंडार और उपलब्ध समान नहीं है। लेकिन यह घातक नहीं है और आप सुरक्षित रूप से जारी रख सकते हैं।

+1

या, init, पुन: कॉन्फ़िगर करें, फिर अपडेट करें: '...; सीडी superrepos; गिट सबमिशन init; git config submodule.name.url ssh: //[email protected]/path/to/other/repos; गिट सबमिशन अपडेट '। –

0

यूआरएल में उपयोगकर्ता नाम शामिल न करें। गिट आपके उपयोगकर्ता नाम और पासवर्ड के लिए संकेत देगा जब आप क्लोन/पुल/आदि

1

ओपन-सोर्स प्रोजेक्ट में इसे संबोधित करने के लिए हम .gitmodules फ़ाइल में एक विश्वसनीय URL दर्ज करते हैं। यह गिट को पेरेंट प्रोजेक्ट के यूआरएल पैटर्न द्वारा क्लोन किए जा रहे यूआरएल के आधार पर सबमिशन यूआरएल क्लोन करने का कारण बन जाएगा।

[submodule "my/tests/schemas"] 
    path = my/tests/schemas 
    url = ../my-schema 

पश्चलेख: एक रिश्तेदार पथ का उपयोग करते हुए बड़े करीने से निर्दिष्ट करने प्रोटोकॉल (https, ssh) और पूरी तरह से उपयोगकर्ता नाम से बचा जाता है पोस्टिंग के बाद मुझे एहसास हुआ कि मेरा जवाब एक डुप्ली है, यहां स्रोत है जिसका उपयोग आप करना चाहिए: Automatically access submodule via ssh or https

संबंधित मुद्दे