2010-12-08 11 views
8

मैं Mercurial के लिए काफी नया हूं, मैंने इस विषय पर बहुत कुछ पढ़ा है लेकिन मुझे एक स्पष्ट उत्तर नहीं मिला है।सबरेपो, एचजी क्लोन और सिम्लिंक

The mercurial guide कहता है: "दक्षता के लिए, जब भी स्रोत और गंतव्य एक ही फाइल सिस्टम पर होते हैं तो क्लोनिंग के लिए हार्डलिंक्स का उपयोग किया जाता है (ध्यान दें कि यह केवल भंडार डेटा पर लागू होता है, न कि कार्यशील निर्देशिका में)।"

Repository wiki page कहता है: "रिपॉजिटरी रूट में .hg निर्देशिका के साथ सह-अस्तित्व में मौजूद सभी फ़ाइलें और निर्देशिका कार्यशील निर्देशिका में रहने के लिए कहा जाता है"।

अब, एक मुख्य रेपो में "लिंक" एक subrepo लिए मुझे क्या करना:

hg init main 
cd main 
echo subrepo = ../subrepo > .hgsub 
hg clone ../subrepo subrepo   # (1) 
hg add 
hg ci -m "initial rev of the main repo" 

परिभाषा ऊपर का मतलब है कि मैं वास्तव में एक प्रतिलिपि subrepo की जब मैं प्रदर्शन (1) बना रहा हूं करता है? ? या मैं ../subrepo पर सिर्फ एक सिम्लिंक बना रहा हूं? ls के आउटपुट के अनुसार, यह एक वास्तविक प्रति है। लेकिन यह मेरे लिए बहुत अजीब लगता है ... अगर कोई इस विषय पर थोड़ा सा प्रकाश डाल सकता है, तो मैं सराहना करता हूं।

+1

बस एक नाइटपिक क्योंकि आपने दोनों शब्दों का उपयोग किया जैसे कि वे अदला-बदले हैं: [हार्ड लिंक प्रतीकात्मक लिंक नहीं हैं] (http://linuxgazette.net/105/pitcher.html)। अंतर मूल रूप से है कि हार्ड लिंक फाइल सिस्टम के भीतर हैं और ब्रेक नहीं कर सकते हैं, जबकि प्रतीकात्मक लिंक में केवल एक पथ होता है और अन्य फाइल सिस्टम को इंगित कर सकता है। Mercurial केवल कड़ी लिंक का उपयोग करता है। –

उत्तर

6

सबसे पहले, Mercurial का वह हिस्सा, मैं एक विशेषज्ञ नहीं हूं, लेकिन यहां मैं समझ गया हूं।

नहीं, आपने पूरी निर्देशिका का लिंक नहीं बनाया है। इसके बजाए, फाइलें इसके अंदर हार्डलिंक थीं।

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

जब आप अपने add या commit (ci) आदेशों के माध्यम से, भंडार से छेड़छाड़ शुरू करते हैं, तो hardlinks मर्क्युरियल और अलग फ़ाइलों से टूट रहे हैं प्रत्येक के लिए निर्माण कर रहे हैं, मांग पर।

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

चूंकि एक सामान्य प्रोजेक्ट में कई फाइलें होती हैं, और एक सामान्य बदलाव केवल कुछ फाइलों को बदलता है, और क्लोन करने का एक सामान्य कारण यह है कि आप परिवर्तनों का एक निश्चित सेट करने जा रहे हैं, हार्डलिंक कई फ़ाइलों के बाद समझ में आता है भंडार निर्देशिका में भंडार निर्देशिका में उनके मूल के लिए 100% समान होगा।

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

+0

+1 आंतरिक अलग-अलग, क्लोनिंग के सामान्य प्रथाओं का पालन करना चाहिए। हालांकि सीखने के उद्देश्यों के लिए चारों ओर खेलना ठीक है। – pyfunc

2

हमें यह देखने के लिए शुरू करें कि जब आप subrepositories के बारे में बात किए बिना क्लोन करते हैं तो क्या होता है। जब आप

$ hg clone A B 

करना तो मर्क्युरियल हार्ड लिंक A/.hg/store/data अंदर फ़ाइलों के लिए कर देगा।तो अगर x नामक एक फ़ाइल पर नज़र रखी है, तो क्लोन के बाद आपको लगता है कि

A/.hg/store/data/x.i 

और

B/.hg/store/data/x.i 

मुश्किल से जुड़े हैं देखेंगे - इसका मतलब है कि दो फ़ाइल नाम वास्तव में एक ही फाइल को देखें। जैसा कि लास बताते हैं, यह स्मार्ट है क्योंकि आप x क्लोन में कभी भी बदलाव नहीं कर सकते हैं, और इसलिए A और B क्लोन के लिए दो अलग-अलग x.i फ़ाइलों को बनाने का कोई कारण नहीं है। एक और फायदा यह है कि फ़ाइल की प्रतिलिपि बनाने के बजाय हार्ड लिंक बनाने के लिए यह बहुत तेज है, खासकर अगर x.i बहुत बड़ा है: हार्ड लिंक एक स्थिर समय ऑपरेशन है।

ऊपर दिए गए उदाहरण में आप उपरोक्त subrepo को main भंडार में जोड़ रहे हैं। एक उपनिवेशी में दो चीजें होती हैं:

  1. उप-क्षेत्रीय स्वयं ही। जब आप

    $ hg clone ../subrepo 
    
  2. उप-स्रोत मेटा डेटा करते हैं तो यह आपके द्वारा बनाया गया है। यह .hgsub फ़ाइल में संग्रहीत है। आपको Mercurial को अवश्य कहना चाहिए जहां आप उपनिवेशी चाहते हैं और जहां Mercurial इसे क्लोन कर सकते हैं।

आप से पूछें कि आप कॉपी या भंडार सिमलिंक, और आप निश्चित रूप से कॉपी किया (क्लोन) यह, जैसा कि आप भी ls साथ पुष्टि की है। बाद में आपने Mercurial में कुछ मेटा डेटा जोड़ा जो बताता है कि यह सब्रेस्पिटरी खोजने की उम्मीद कर सकता है। सामान्य फाइल सिस्टम अर्थ में प्रतीकात्मक लिंक के साथ इसका कोई लेना-देना नहीं है, यह Mercurial के लिए केवल कुछ मेटा डेटा है।

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