2010-09-08 8 views
26

हमारे पास दो स्तरीय सेटअप हैं।प्राथमिक रेपो के साथ सिंक में स्वचालित रूप से द्वितीयक रेपो रखें?

हमारे पास एक प्राथमिक भंडार है (जिसे नीचे 'प्राथमिक' कहा जाता है)।

और एक माध्यमिक भंडार ('माध्यमिक' नीचे कहा जाता है) तो तरह बनाया गया था कि:

$ git clone --bare --shared $REPO_A/primary secondary.git 

माध्यमिक भंडार पर काम करने वालों को शाखाओं के रूप में केवल पढ़ने के लिए जो प्राथमिक भंडार से उत्पन्न देखने लेकिन अपने स्वयं के आधार इन शाखाओं से शाखाएं।

हम दिन में एक बार प्राथमिक भंडार के साथ द्वितीयक भंडार को सिंक करना चाहते हैं।

आईई। हम काम करना चाहते हैं और नई शाखाएं जिन्हें माध्यमिक भंडार (अगली बार जब वे खींचते हैं) से काम करने वाले लोगों के लिए प्राथमिक बनने के लिए प्राथमिक को धकेल दिया जाता है।

हम नहीं चाहते हैं कि यह सममित हो, यानी द्वितीयक भंडार के खिलाफ गतिविधि प्राथमिक भंडार से काम करने वालों के लिए दृश्यमान नहीं होगी।

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

मुझे उम्मीद थी कि ऐसा करने का एक आसान तरीका हो सकता है (और मुझे उम्मीद है कि यहां कोई मुझे बताएगा)।

मैं यह करने के लिए एक स्क्रिप्ट लिखने के लिए थे, तो यह करना होगा:

  • माध्यमिक के एक ताजा क्लोन बनाएँ।

    $ git clone $REPO_B/secondary 
    $ cd secondary 
    
  • अपनी सभी शाखाएं पाएं।

    $ git branch -r | sed 's?.*origin/??' 
    
  • प्राथमिक रेपो में सभी शाखाएं प्राप्त करें।

    $ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??' 
    
  • प्रत्येक प्राथमिक शाखा है जिसके लिए मैं पहले से ही एक इसी माध्यमिक शाखा की जरूरत नहीं है के लिए:

    :

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME 
    $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME 
    
  • प्रत्येक प्राथमिक शाखा है जिसके लिए मैं पहले से ही एक इसी माध्यमिक शाखा है के लिए

    $ git checkout -b $BRANCHNAME --track origin/$BRANCHNAME 
    $ git pull $REPO_A/primary $BRANCHNAME 
    $ git push 
    

जैसा कि मैं गिट करने के लिए नया हूं, मैं आश्चर्यचकित नहीं होगा अगर मैं टी विफल नहीं हुआ o कुछ मौलिक मुद्दों पर विचार करें?

और जैसा कि मैंने कहा था कि मुझे उम्मीद है कि ऐसा करने का एक आसान तरीका है, यानी कोई चला जाता है "ओह, ऐसा मत करो, बस करें ..."।

उत्तर

25

ओह, वह सब नहीं करते हैं, बस करो:

git --bare fetch 

;)

(इस old thread for instance)
देखें आप अपने नंगे रेपो को relevant remote origins को शामिल किया है, तो आप प्राप्त कर सके बदले में उन सभी उत्पत्ति।

+4

ऐसा लगता है कि मैं क्या चाहता हूं। लिंक के लिए धन्यवाद - इनसे मुझे यह मिला: '$ cd media.git ; गिट - बेयर fetch उत्पत्ति '+ refs/head/*: refs/head/*' ' एक अनुभवी यूनिक्स हैकर के रूप में मैं हमेशा वास्तव में समझना चाहता हूं कि मैं क्या कर रहा हूं। हालांकि अधिकांश गिट दस्तावेज़ वास्तव में प्रतीत होते हैं सरल एलिस और बॉब के मामले, और कुछ और जटिल जटिल किताबों की शैली प्रस्तुत की जाती है। क्या आप गिट के लिए एक अच्छी _in-depth_ पुस्तक या वेब प्रलेखन की सिफारिश कर सकते हैं? –

+4

@ जॉर्ज: हाँ: http://www.newartisans.com/2008/04/ Git-से-वें ई-तल-अप.html, हालांकि http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive- व्यावहारिक- गाइड कई अन्य रोचक लिंक प्रदान करता है। http://tom.preston-werner.com/2009/05/19/the-git-parable.html भी अच्छा है। – VonC

+0

यह भी ध्यान रखें कि उन रेफरी चश्मा आपके गिट कॉन्फ़िगरेशन में हैं, इसलिए 'fetch = + refs/*: refs/*' के साथ, आपको बस 'git fetch' – Dustin

10

आप केवल git clone --bare --mirror कर सकते हैं और समय-समय पर ऐसा करने के लिए git fetch कर सकते हैं।

मैं इसे gitmirror नामक टूल का उपयोग करके वास्तविकता करता हूं जिसे मैंने नोड में लिखा था।जेएस कि मैं घर पर एक मशीन पर गिटूब से वेबहुक प्राप्त करने के साथ-साथ विज्ञापन-हुक हुक को सिंक करने के लिए चलाता हूं।

गैर-गीथब उदाहरण के लिए, मेरे पास एक रेपो है जिसका उपयोग एक कॉचडब बैकअप के लिए किया जाता है जिसमें एक घंटे में एक बार प्रतिबद्धता होती है। क्रॉन जॉब मूल रूप से इस के लिए नीचे आता है:

# do some backup stuff 
git commit -qam "Backup `date`" >> dump.log 2>&1 

वहाँ से, मैं एक के बाद प्रतिबद्ध हुक (.git/hooks/post-commit) है कि इस तरह दिखता है:

#!/bin/sh 
curl -sS http://my.home.machine/gitmirror/bak/repo-name.git 

आप से धक्का द्वारा एक ही बात को पूरा कर सकते प्राप्त पक्ष। इसका सामान्य मामले में पेलोड को फायरिंग और भूलने का लाभ है।

+0

संपादित करें: क्लोन लाइन में '--bare' जोड़ा गया क्योंकि VonC ने मुझे याद दिलाया। आम तौर पर मैं इसे करता हूं और महसूस करता हूं कि मैंने '--bare' नहीं किया और फिर मैन्युअल रूप से इसे परिवर्तित या फिर से किया। – Dustin

+0

दिलचस्प बैकअप विकल्प (और मेरा से अधिक विस्तृत उत्तर)। +1 – VonC

+1

वॉनसी का सुझाव ऐसा लगता है जो मैं चाहता हूं। हालांकि मुझे बुरा लगता है - क्योंकि मैंने वास्तव में डस्टिन के सुझाव को इस आधार पर एक मौका नहीं दिया है कि मुझे कुछ भी नहीं मिल रहा है जो _meanfulful_ तरीके से --mirror विकल्प को समझाता है। ईजी। गिट-क्लोन मैन पेज "रिमोट रिपोजिटरी का दर्पण सेट अप" से अधिक नहीं कहता है। इसका मतलब है - बेयर। " लेकिन इसका अर्थ जीवन चक्र के अनुसार क्या है? एक रिपोजिटरी किस प्रकार से है --mirror एक से अलग है जो नहीं है? आश्चर्यजनक रूप से Google- ing ने मुझे प्रबुद्ध नहीं किया :( –