2010-10-18 17 views
340

--bare Git क्लोन सहायता पृष्ठ यह कहना बारे में --mirror है:क्या Git क्लोन --mirror और Git क्लोन के बीच का अंतर है

दूरदराज के भंडार का एक दर्पण सेट करें। यह --bare का तात्पर्य है।

लेकिन यह कैसे --mirror क्लोन एक --bare क्लोन से अलग है के बारे में विस्तार में जाने नहीं देता है।

+1

उपयोगी fetch कुंजी, आप इसे अपडेट कर सकते हैं, जिसका मतलब है, नहीं है, लेकिन अगर आप भी GitHub की तरह एक दूरस्थ रेपो को यह दर्पण पुश करने के लिए चाहते हैं, मैंने पाया [इस लिंक] (https://help.github.com/articles/duplicating-a-repository#mirroring-a-repository) आसान। –

उत्तर

404

अंतर यह है कि जब --mirror का उपयोग कर, सभी refs कॉपी कर रहे हैं के रूप में है। इसका मतलब है सबकुछ: रिमोट-ट्रैकिंग शाखाएं, नोट्स, रेफरी/मूल/* (फ़िल्टर-शाखा से बैकअप)। क्लोन रेपो में यह सब है। यह भी स्थापित किया गया है कि एक दूरस्थ अद्यतन मूल से सबकुछ फिर से प्राप्त करेगा (कॉपी किए गए रेफरी को ओवरराइट कर रहा है)। विचार वास्तव में प्रतिलिपि को मिरर करना है, कुल प्रतिलिपि बनाने के लिए, ताकि आप उदाहरण के लिए कई स्थानों पर अपने केंद्रीय रेपो को होस्ट कर सकें या इसे वापस कर सकें। एक बहुत अधिक सुरुचिपूर्ण गिट तरीके को छोड़कर, रेपो की प्रतिलिपि बनाने के बारे में सोचें।

नई documentation काफी यह सब कहते हैं:

--mirror

स्रोत भंडार का एक दर्पण सेट करें। यह --bare का तात्पर्य है। --bare की तुलना में, --mirror न केवल लक्ष्य की स्थानीय शाखाओं के स्रोत की स्थानीय शाखाओं को मानचित्र करता है, यह सभी रेफरी (रिमोट शाखाओं, नोट्स इत्यादि सहित) को मानचित्र करता है और एक रेफस्पेक कॉन्फ़िगरेशन सेट करता है जैसे कि इन सभी रेफरी को git remote update द्वारा अधिलेखित किया जाता है लक्ष्य भंडार।

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

मान लीजिए मूल में कुछ शाखाएं हैं (master (HEAD), next, pu, और maint), कुछ टैग (v1, v2, v3), कुछ सुदूर शाखाओं (devA/master, devB/master), और कुछ अन्य refs (refs/foo/bar, refs/foo/baz, जो हो सकता है नोट्स, स्टैश, अन्य देवताओं के नामस्थान, जो जानता है)।

  • git clone origin-url (गैर नंगे): यदि आप टैग की नकल की के सभी मिल जाएगा, एक स्थानीय शाखा master (HEAD) एक दूरस्थ शाखा origin/master, और दूरदराज शाखाओं origin/next, origin/pu, और origin/maint पर नज़र रखने। ट्रैकिंग शाखाएं स्थापित की गई हैं ताकि यदि आप git fetch origin जैसे कुछ करते हैं, तो वे आपकी अपेक्षा के अनुसार लाए जाएंगे। किसी भी दूरस्थ शाखा (क्लोन रिमोट में) और अन्य रेफरी पूरी तरह से अनदेखा कर रहे हैं।

  • git clone --bare origin-url: आप टैग की नकल की के सभी मिल जाएगा, स्थानीय शाखाओं master (HEAD), next, pu, और maint, कोई रिमोट ट्रैकिंग शाखाओं। यही है, सभी शाखाओं की प्रतिलिपि बनाई गई है, और यह पूरी तरह से स्वतंत्र है, फिर से लाने की कोई उम्मीद नहीं है। किसी भी दूरस्थ शाखा (क्लोन रिमोट में) और अन्य रेफरी पूरी तरह से अनदेखा कर रहे हैं।

  • git clone --mirror origin-url: उन सभी रेफरी में से प्रत्येक अंतिम की प्रतिलिपि बनाई जाएगी। आप सभी टैग, स्थानीय शाखाओं master (HEAD), next, pu, और maint, दूरस्थ शाखाओं devA/master और devB/master, अन्य refs refs/foo/bar और refs/foo/baz मिलेगा। सब ठीक है जैसा कि यह क्लोन रिमोट में था। रिमोट ट्रैकिंग सेट अप की गई है ताकि यदि आप git remote update चलाते हैं तो सभी रेफरी मूल से ओवरराइट हो जाएंगे, जैसे कि आपने अभी दर्पण हटा दिया होगा और इसे पुनः प्राप्त कर दिया होगा। चूंकि दस्तावेज़ों ने मूल रूप से कहा था, यह एक दर्पण है। यह एक कार्यात्मक रूप से समान प्रति होना चाहिए, मूल के साथ विनिमयशील।

+0

क्या "सामान्य क्लोन" क्लोन या --mirror झंडे के बिना क्लोन का संदर्भ देता है? – Sam

+1

हाँ, यह करता है। एक नंगे क्लोन के साथ, जैसा कि यह मनुष्य पृष्ठ पर कहता है, शाखाओं को भी सीधे कॉपी किया जाता है (कोई रेफरी/रिमोट/मूल नहीं, कोई ट्रैकिंग नहीं)। – Cascabel

+0

में संपादित किया गया क्या आप अंतर के बारे में कुछ और उपयोग उदाहरण जोड़ सकते हैं, केवल गिट-आंतरिक अंतर नहीं? – cmcginty

39
$ git clone --mirror $URL 

के लिए

$ git clone --bare $URL 
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL) 

एक छोटी हाथ (here से सीधे कॉपी किया गया)

कैसे वर्तमान मानव पेज कहते है:

तुलना --bare, --mirror को न केवल लक्ष्य की स्थानीय शाखाओं के स्रोत की स्थानीय शाखाओं को मानचित्रित करता है, यह सभी रेफरी (i रिमोट शाखाओं, नोट्स इत्यादि को छोड़कर) और एक रेफस्पेक कॉन्फ़िगरेशन सेट अप करता है जैसे कि इन सभी रेफरी को लक्ष्य भंडार में git remote update द्वारा अधिलेखित किया जाता है।

+3

मेरा मानना ​​है कि आपको वास्तव में समान होने के लिए 'गिट फ़ेच' के साथ इसका पालन करना होगा। वैसे भी, यह एक गैर-उत्तर की तरह है - सवाल का मुद्दा यह है कि "दर्पण रिमोट/क्लोन सामान्य से अलग कैसे होता है?" – Cascabel

+0

मुझे लगता है कि यह सही जवाब नहीं है। –

+3

मुझे वास्तव में अंतर का प्रदर्शन करने के इस तरीके को पसंद है। उम्मीद है कि यह सही है! मुझे उम्मीद है कि एचएफएस fetch कमांड जोड़ता है। – joeytwiddle

10

एक क्लोन रिमोट से रेफरी की प्रतिलिपि बनाता है और उन्हें 'उपरोक्त रिफ्रेशंस' नामक एक उपनिर्देशिका में रखता है।

एक दर्पण रिमोट से रेफरी प्रतिलिपि बनाता है और उन्हें अपने शीर्ष स्तर पर रखता है - यह रिमोट के साथ अपने स्वयं के रेफरी को प्रतिस्थापित करता है।

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

18

आज गिट-2.0.0 के साथ मेरे परीक्षण इंगित करते हैं कि --mirror विकल्प हुक, कॉन्फ़िगरेशन फ़ाइल, विवरण फ़ाइल, जानकारी/फ़ाइल को बहिष्कृत नहीं करता है, और कम से कम मेरे परीक्षण मामले में कुछ रेफरी (जो मुझे समझ में नहीं आता है।) मैं इसे "कार्यात्मक रूप से समान प्रतिलिपि, मूल के साथ विनिमय करने योग्य नहीं कहूंगा।"

-bash-3.2$ git --version 
git version 2.0.0 
-bash-3.2$ git clone --mirror /git/hooks 
Cloning into bare repository 'hooks.git'... 
done. 

-bash-3.2$ diff --brief -r /git/hooks.git hooks.git 
Files /git/hooks.git/config and hooks.git/config differ 
Files /git/hooks.git/description and hooks.git/description differ 
... 
Only in hooks.git/hooks: applypatch-msg.sample 
... 
Only in /git/hooks.git/hooks: post-receive 
... 
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ 
... 
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ 
Only in /git/hooks.git/refs/heads: fake_branch 
Only in /git/hooks.git/refs/heads: master 
Only in /git/hooks.git/refs: meta 
9

Duplicating a Repository पर GitHub प्रलेखन से एक सूक्ष्म विवरण:

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

+1

धन्यवाद; यह मेरे लिए स्पष्ट किया गया है कि स्थानीय * टैग * एक प्रतिबिंबित क्लोन का उपयोग करके शाखाओं को ओवरराइट किया जाएगा। बहुत उपयोगी। – Wildcard

+0

आप रिमोट पर अब स्थानीय संदर्भों को हटाने के लिए गिट फ़ेच चलाने पर '--prune' का उपयोग भी करना चाहेंगे। – nishanths

7

मैं एक तस्वीर जोड़ता हूं, दर्पण और नंगे के बीच config अंतर दिखाता हूं। enter image description here बाएं बेयर है, सही दर्पण है।आप स्पष्ट हो सकता है, दर्पण के कॉन्फ़िग फ़ाइल द्वारा git remote update या git fetch --all

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