2009-10-23 17 views
14

मैं अभी गिट के साथ शुरू कर रहा हूं और मेरे पास एक सवाल है। मेरे ऐप में 10 अन्य डेवलपर्स काम कर रहे हैं, प्रत्येक व्यक्ति की अपनी शाखा dev_XXXXX की तरह है। तो अगर मैं भंडार का क्लोन करता हूं, तो क्या उनके सभी कोड मेरी मशीन पर कॉपी हो जाते हैं? उस मामले में मुझे वह नहीं चाहिए। मान लीजिए कि मेरी शाखा dev_swamy है, तो मैं फिर स्थिर शाखा और dev_swamy कैसे क्लोन करूँ? धन्यवाद।गिट में केवल स्थिर और एक अन्य शाखा क्लोन करें?

उत्तर

23

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

फिर भी अगर आप केवल दो चयनित शाखाओं के साथ एक क्लोन करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

  1. पहले, नया खाली भंडार

    $ mkdir repoclone 
    $ cd repoclone/ 
    $ git init 
    Initialized empty Git repository in /home/user/repoclone/.git/ 
    
  2. बनाने फिर अपने डेटा संग्रह स्थान जुड़ 'मूल' नाम के तहत (जैसे "गिट क्लोन" इसका नाम होगा), "git remote" कमांड का उपयोग करके केवल दो शाखाओं की ट्रैकिंग का अनुरोध करना: 'मास्टर' और 'dev_swamy'। जांचें कि यह सही ढंग से जोड़ा गया था।

    $ git remote add -t master -t dev_swamy origin [email protected]:repo.git 
    $ git remote 
    origin 
    $ git remote show origin 
    * remote origin 
        Fetch URL: [email protected]:repo.git 
        Push URL: [email protected]:repo.git 
        HEAD branch: master 
        Remote branches: 
        master   new (next fetch will store in remotes/origin) 
        dev_swamy new (next fetch will store in remotes/origin) 
    

    यदि स्थिर शाखा को 'मास्टर' के बजाय 'स्थिर' कहा जाता है, तो आप उपर्युक्त उदाहरण को संशोधित करना चाहते हैं। यदि आप निर्दिष्ट शाखा को रिमोट में डिफ़ॉल्ट शाखा के रूप में चाहते हैं तो -m <branch> विकल्प भी है।

  3. 'मूल' से प्राप्त करें (आप भी -f विकल्प का उपयोग कर के ऊपर "Git दूरस्थ जोड़ें" करने के लिए कर ऐसा कर सकता है):

    $ git fetch 
    remote: Counting objects: 282, done. 
    remote: Compressing objects: 100% (193/193), done. 
    remote: Total 282 (delta 82), reused 0 (delta 0) 
    Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done. 
    Resolving deltas: 100% (82/82), done. 
    From [email protected]:repo.git 
    * [new branch]  master  -> origin/master 
    * [new branch]  dev_swamy -> origin/dev_swamy 
    From [email protected]:repo.git 
    * [new tag]   v1.0  -> v1.0 
    * [new tag]   v1.0.1 -> v1.0.1 
    * [new tag]   v1.1  -> v1.1 
    
  4. सेट करें स्थानीय शाखा 'मास्टर' (तुम कहाँ करना होगा अपने काम) 'मूल/मास्टर' का पालन करने के (नदी के ऊपर के रूप में 'मूल/मास्टर') के लिए, जैसे "Git क्लोन" करना होगा:

    $ git checkout -t origin/master 
    Branch master set up to track remote branch master from origin. 
    Already on 'master' 
    

    आप शाखा 'dev_swamy' के लिए यह दोहरा सकते हैं।

  5. अब आप देख सकते हैं कि कॉन्फ़िगरेशन फ़ाइल कैसा दिखता है। आप निम्न की तरह दिखने के लिए .git/config फ़ाइल संपादित करके और फिर "गिट फ़ेच" संपादित करके एक ही परिणाम प्राप्त कर सकते हैं। (; प्रति-उपयोगकर्ता कॉन्फ़िग फ़ाइल में आमतौर पर अर्थात सेट 'user.name' और 'user.email' config चर)

    $ cat .git/config # or just open this file in your editor 
    [core] 
         repositoryformatversion = 0 
         filemode = true 
         bare = false 
         logallrefupdates = true 
    [remote "origin"] 
         url = [email protected]:repo.git 
         fetch = +refs/heads/master:refs/remotes/origin/master 
         fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy 
    [branch "master"] 
         remote = origin 
         merge = refs/heads/master 
    

भंडार पर काम शुरू करने से पहले Git करने के लिए अपने आप को लागू करने के लिए मत भूलना!

4

यदि आप क्लोन करते हैं, तो सभी शाखाओं में सभी संशोधन क्लोन किए जाते हैं, लेकिन क्लोन रिपोजिटरी डिफ़ॉल्ट रूप से मास्टर की जांच करेगी।

बस चयनित शाखाएं लेना मुश्किल है क्योंकि गिट वास्तव में नहीं सोचता कि आपको इस तरह से काम करना चाहिए। आप मैन्युअल रूप से शाखाओं नीचे खींचने के लिए है:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 
git fetch origin master:master 
git fetch origin dev_XXX:dev_XXX 

से ऊपर मैं क्या काम किया पता था कि है। हालांकि, अगर आप एक गिट रेपो सेट करना चाहते हैं जो सामान्य के रूप में काम करता है, तो इसकी रिमोट शाखाओं का एक और संकीर्ण दृश्य है? आप बहुत आसानी से ऐसा कर सकते हैं:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 

# now open .git/config for editing in your editor 
# replace the following line (grab all remote branches) 
fetch = +refs/heads/*:refs/remotes/origin/* 

# replace with lines listing exactly which branches you want 
fetch = +refs/heads/master:refs/remotes/origin/master 
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX 

# save the file, now run 

git fetch 
+0

आह! यह कुछ ऐसा है जो मैं थोड़ी देर के लिए सोच रहा था - क्या केवल एक शाखा क्लोन करने का कोई तरीका है। इसे अपने सिर पर बदलने और केवल वही चीज़ लाने के लिए एक दिलचस्प विचार है जो आपको चाहिए। लेकिन पहला fetch इस त्रुटि उत्पन्न करता है: "घातक: मौजूदा शाखा रिफ्रेंस/हेड/गैर-नंगे भंडार के मास्टर में लाने से इनकार करते हुए" –

+0

आधुनिक गिट के साथ बीटीडब्ल्यू आप 'गिट इनिट रिपोक्लोन' –

+0

@Steve का उपयोग कर सकते हैं: आह, आप सही हैं । मास्टर सेट करने के लिए आप "गिट फ़ेच मूल मास्टर; गिट रीसेट --हार्ड FETCH_HEAD'" के साथ प्रतिस्थापित कर सकते हैं। – u0b34a0f6ae

0

मुझे लगता है कि यहाँ और अधिक महत्वपूर्ण सवाल क्या दूसरों को प्रेरित कर दिया जाएगा नहीं आप क्लोनिंग की जाएगी क्या या खींच है। चूंकि प्रत्येक डेवलपर अपनी शाखा पर काम कर रहा है, एक और सवाल यह है कि आप एक सामान्य कोड बेस के साथ कैसे समाप्त होते हैं। क्या डेवलपर्स अपनी शाखाओं को मास्टर करने के लिए विलय कर रहे हैं? और फिर वे अपनी बदली हुई मास्टर शाखा को केंद्रीय भंडार में डाल रहे हैं? यदि ऐसा है, तो वैसे भी अन्य डेवलपर्स की शाखाओं को खींचने का कोई तरीका नहीं है।

यदि ऐसा नहीं है, तो मैं यह देखने में विफल रहता हूं कि आप एक कार्यशील टीम कैसे बना सकते हैं।

और जैसा कि मैंने अंतिम विचार किया: मुझे यह जानकर उत्सुकता होगी कि आप अन्य डेवलपर्स की शाखाओं को अपने भंडार में क्यों नहीं रखना चाहते हैं?

0

ऐसा करने का एक और तरीका प्रत्यक्ष क्लोन से बचने के लिए है, लेकिन इसके बजाय मैन्युअल रूप से रिचस्पेक्स लाने के कस्टम सेट के साथ रिमोट जोड़ें।

उदा।

mkdir myclone 
cd myclone 
git init 

git remote add origin url://origin.repo 

# Add fetch rules for the branches that we want to track 
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master 
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy 

# fetch now fetches just what we need, subsequently it will do incremental fetches 
git fetch 

# Creating local branches tracking the remote branches 
git checkout -b master origin/master 
git branch dev_swamy origin/dev/swamy 
संबंधित मुद्दे