2011-04-06 11 views
6

मुझे क्लोन रिपॉजिटरीज़ और शाखाओं का उपयोग करके गिट के साथ कुछ समस्याएं हैं और यह मेरे लिए इसका जवाब खोजने के लिए किसी भी तरह से संभव नहीं है। मुझे वर्णन करने दें: हमारे पास एक नंगे मास्टर गिट भंडार है, हम सभी स्थानीय लिनक्स मशीन पर स्थित और एसएसएच के साथ पहुंचने के लिए खींचते हैं और धक्का देते हैं। मैं इस तरह मेरी USB थंब ड्राइव करने के लिए इस का क्लोन बनाया:गिट बाद के क्लोन पर सभी शाखाओं को क्लोन नहीं करता है?

git clone ssh://[email protected]//net/repos/netcube/patches.git 

यह मैं देता जाहिर है मेरी थंब ड्राइव पर एक काम की नकल के साथ एक स्थानीय क्लोन। इस के लिए मैं सीडी और देखते हैं कि यह क्लोन तो में कुछ शाखाओं:

cd patches 
git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 
    remotes/origin/stable 

अब तक तो अच्छा, लेकिन यदि मैं क्लोन मेरे अंगूठे पर भंडार एक बार मेरी नोटबुक को स्थिर शाखा खो दिया है ड्राइव। देखें:

cd .. 
git clone patches patches2 

cd patches2 

git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 

मैं कई विकल्प की कोशिश की जब क्लोनिंग या एक git fetch क्लोनिंग के बाद, कुछ भी नहीं patches2 भंडार को स्थिर शाखा लाता है। मुझे लगता है कि मेरे पास समझने की कमी है और इसे गलत तरीके से उपयोग करें। क्या कोई मुझे उपयोग और/या समझ में मेरी त्रुटि के लिए इंगित कर सकता है?

+1

टिप्पणियों के लिए धन्यवाद मुझे एक विचार है कि मेरी गलतफहमी क्या थी। मैं चाहता था कि »ट्रांसफर रिपॉजिटरीज़« मास्टर रिपोजिटरी से सामग्री को _all_ के साथ करें लेकिन गिट आपकी ट्रैकिंग शाखाओं के आधार पर किसी प्रकार का चुनिंदा क्लोनिंग करता है। 'गिट क्लोन --mirror' के साथ मुझे एक इंटरमीडिएट रिपोजिटरी मिलती है, जिस तरह से मैं उम्मीद करता हूं। – LeSpocky

+0

इसे और अधिक सरलता से रखने के लिए, 'गिट क्लोन' (विशेष विकल्पों के बिना) स्रोत स्रोत से रिमोट-ट्रैकिंग शाखाओं की प्रतिलिपि नहीं बनाएगा, केवल स्रोत पर स्थानीय शाखाएं ('.git/refs/head /' के अंतर्गत वाले स्रोत, 'जीआईटी/रेफ/रिमोट्स//' –

उत्तर

3

How to clone all remote branches in Git?

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

हालांकि, अगर नोटबुक में कोई नेटवर्क कनेक्टिविटी नहीं है, तो आपको अपनी सभी दूरस्थ शाखाओं के लिए स्थानीय शाखाएं बनाना होगा ताकि वे आपके स्थानीय रेपो को क्लोन करते समय क्लोन कर सकें।

यदि आपके पास नेटवर्क कनेक्टिविटी है, तो git remote add origin2 ssh://[email protected]//net/repos/netcube/patches.git और फिर git fetch origin2 का उपयोग करें - अधिक अर्थपूर्ण नाम के साथ origin2 को प्रतिस्थापित करने के लिए स्वतंत्र महसूस करें।

+0

के तहत नहीं, अगर मेरे पास नोटबुक से मास्टर रिपोजिटरी में नेटवर्क कनेक्टिविटी थी, तो मुझे ट्रांसफर रिपोजिटरी (पैच) की आवश्यकता नहीं होगी। क्या भ्रमित मुझे लगता है कि ट्रांसफर रिपोजिटरी का पहला क्लोन मास्टर रिपोजिटरी के _all_ परिवर्तनों के साथ एक सटीक «क्लोन जैसा प्रतीत होता है लेकिन दूसरा क्लोन कुछ बदलावों को छोड़ देता है, सिर्फ इसलिए कि कोई स्थानीय शाखा« लेबल नहीं है। – LeSpocky

+0

नहीं, पहला क्लोन बस स्रोत को रिमोट (* मूल *) के रूप में जोड़ता है और इस प्रकार इसकी शाखाएं लाता है। हालांकि, रिमोट को क्लोन नहीं किया जाता है, इसलिए आपकी छड़ी पर रेपो को यह रिमोट या उसकी ब्रा नहीं होगी nches। – ThiefMaster

+0

यह मैंने अभी किया है: मेरे स्थानांतरण भंडार में ट्रैकिंग शाखाएं बनाएं, इसलिए इन्हें बाद के क्लोन में भी क्लोन किया जा सकता है। इसके लिए थोड़ा और मैन्युअल काम की आवश्यकता है, लेकिन यह उचित समाधान लगता है। – LeSpocky

2

"मूल" उस स्थान पर दिया गया डिफ़ॉल्ट नाम है जिसे आपने रेपो से क्लोन किया है, जिसे स्वचालित रूप से रिमोट के रूप में जोड़ा जाता है (नोट: रिमोट का मतलब है "एक रेपो वर्तमान नहीं है" - रिमोट एक ही मशीन पर हो सकते हैं)।

patches में, "मूल" गोल्लम पर मूल रेपो को संदर्भित करता है।

patches2 में, "मूल" patches को संदर्भित करता है।

रिमोट ट्रैकिंग रेफरी (remotes/ से शुरू होने वाले लोग) वास्तव में स्थानीय शाखाएं नहीं हैं - वे केवल पॉइंटर्स हैं जहां शाखाओं को अंतिम रूप से रिमोट पर जाना जाता था। इस प्रकार, patches में, आपके पास मूल रेपो के लिए रिमोट ट्रैकिंग रेफरी है, लेकिन patches2 पर, आपके पास केवल patches में स्थानीय master शाखा के लिए रिमोट ट्रैकिंग रेफरी है, क्योंकि यह patches2 का मूल बिंदु है।

आप इसे क्लोनिंग के बाद patches2 में एक और रिमोट के रूप में मूल रेपो जोड़ने के लिए git remote add उपयोग कर सकते हैं - या तो आप सिर्फ मूल रेपो से बजाय patches से फिर से क्लोन सकता है।

+0

मैं मूल रेपो से _patches2_ पर क्लोन नहीं कर सकता, क्योंकि मैं मूल रेपो से कनेक्ट नहीं कर सकता। भंडार _patches_ सिर्फ एक »स्थानांतरण भंडार है« जहां मैं वैसे भी काम नहीं करता। – LeSpocky

+0

@LeSpocky: मुझे लगता है बिंदु से वंचित हो रहे है कि 'patches2' में के रूप में" दूरस्थ "सूचीबद्ध शाखाओं सब जो कि" स्थानीय "' patches' में हैं (के बाद से है कि क्या 'origin' की तरह @, को संदर्भित करता है कर रहे हैं एम्बर ने कहा)। यदि आपने 'पैच' में 'स्थिर' शाखा की जांच नहीं की है (तो स्थानीय रूप से), तो यह 'patches2' के लिए रिमोट की सूची में नहीं होगी। – nickgrim

+0

समस्या है: अगर मैं TortoiseGit का उपयोग _patches2_ में _all_ शाखाओं के _all_ changesets दिखाने के लिए ऐसा लगता है _patches_ में _stable_ शाखा से संबंधित changesets _patches2_ को क्लोन नहीं हैं, इसलिए भले ही मैं पता होगा जो changesets मैं की जरूरत है, मैं wouldn ' उन्हें दूसरे रेपो (पैच 2) में नहीं मिलता है, क्योंकि उन्हें पहले रेपो (पैच) से क्लोन नहीं किया जाता है। हालांकि मुझे लगता है कि _all_ परिवर्तनों के साथ संपूर्ण भंडार क्लोन किया गया है और न केवल इसका एक हिस्सा है। – LeSpocky

12

@ThiefMaster के अलावा:

मैं सभी (स्थानीय & दूरस्थ) शाखा refs और टैग

अतिरिक्त अद्यतन करने के लिए

git clone --mirror 

या

git push --mirror 

चाहते जानकारी एन के रूप में oted, --mirror वास्तव में रेपो को दोहराना होगा, इस प्रकार गंतव्य में अत्यधिक बदलाव आया है। शाखाओं में जो स्रोत में मौजूद नहीं हैं, बिना शर्त के छिड़काए जाएंगे।

मूलतः, यह एक दूरस्थ के साथ काम करने और 'Git दूरस्थ अद्यतन --prune' कर रही है, अंतर किया जा रहा है कि शाखाओं प्रभावित स्थानीय शाखाओं के साथ-साथ 'दूरस्थ' refs हो सकता है की तरह है [1]

@LeSpocky (और अन्य?)

अब यदि परिवर्तन गायब हो जाते हैं, तो वे कभी भी विलय की समस्याएं उत्पन्न नहीं करेंगे, इसलिए यह आसान है।

--mirror का नाम वास्तविक जीवन अवधारणा के नाम पर रखा गया है, इसलिए इसे लक्ष्य में किसी भी अंतर को रोकने के लिए डिज़ाइन किया गया था। यदि लक्ष्य गैर-बेकार है, और आपके पास स्थानीय परिवर्तन किए गए हैं, तो आप उन्हें हमेशा लक्ष्य की स्थानीय शाखा (git log -g, git reflog) के रीफ्लॉग के माध्यम से वापस प्राप्त कर सकते हैं।

एक सामान्य सुरक्षा उपाय के रूप में आप have a hook to 'git stash save' in the target कर सकते हैं।

हालांकि, ध्यान रखें कि, mirror को दर्पण पर डिजाइन किया गया था और यह प्रश्न वास्तव में सभी शाखाओं को एक नंगे रिमोट में दोहराने के तरीके पर था। :)

[1] (रेफरी वहां हैं, लेकिन दूरस्थ परिभाषाओं की प्रतिलिपि नहीं बनाई जाती है; यदि आप चाहते हैं, तो पुश गंतव्य पर .git/config से .git/config से मैन्युअल प्रति करें)

+0

अगर मैं '--mirror' विकल्प का उपयोग मेरे हस्तांतरण भंडार बनाने के लिए _patches_ _patches2_ के लिए बाद में क्लोन स्थिर शाखा है। ऐसा लगता है कि यह वह विकल्प है जिसकी मुझे आवश्यकता है, जिसे मैं प्राप्त करना चाहता हूं। – LeSpocky

+1

ध्यान दें कि '--mirror' के साइड इफेक्ट्स हो सकते हैं यदि कोई और उस रिपोजिटरी को बदलता है जिसे आप उस दौरान क्लोन करते समय मिररिंग कर रहे हैं और उसके बाद इसे दबाएं-' --mirror' सेट अप करता है जैसे कि वे हमेशा रिमोट को ओवरराइट करते हैं , किसी भी नए बदलाव के बावजूद। – Amber

+0

@Amber: अतिरिक्त जानकारी के लिए अद्यतन उत्तर – sehe

0
$ git remote update 
$ git pull --all 
संबंधित मुद्दे