2011-04-07 18 views
5

मेरी प्रोजेक्ट में नेटवर्क फ़ाइल सिस्टम पर एक सबवर्जन रिपोजिटरी है, और एक नई टीम गिट का उपयोग करके इसे एक्सेस करना चाहती है, और इसे प्रतिबद्ध करने और उससे अपडेट प्राप्त करने में सक्षम होती है।स्वचालित रूप से एक सबवर्जन रिपोजिटरी और एक गिट रिपोजिटरी को सिंक्रनाइज़ करना

मुझे क्या लगता है कि एक ही नेटवर्क फ़ाइल सिस्टम पर सबवर्जन रिपोजिटरी का नया नंगे git-svn क्लोन बनाना है, और सुनिश्चित करें कि दो रिपॉजिटरी हमेशा एक-दूसरे के संबंध में अद्यतित हैं।

ऐसा करने का तरीका शायद सबवर्सन और नए गिट भंडार दोनों के लिए एक पोस्ट-प्रतिबद्ध हुक जोड़ने के लिए है, जो प्रत्येक दूसरे के भंडार को अपडेट करेगा।

सबवर्जन पोस्ट-प्रतिबद्ध हुक में git svn rebase, और गिट एक git svn dcommit शामिल होगा।

समस्या यह है कि मुझे यह सुनिश्चित करने के लिए किसी प्रकार का ताला उपयोग करना होगा कि कोई भी भंडार करने के लिए प्रतिबद्ध नहीं है जबकि अन्य भी प्रतिबद्ध है, क्योंकि उन्हें हमेशा किसी भी प्रतिबद्धता से पहले सिंक होना पड़ता है। इसमें कई नुकसान हैं, उनमें से सबवर्सन को प्रतिबद्ध करने के लिए या गिट रिपोजिटरी को धक्का देने के लिए समय लगेगा (इसे हुक खत्म करने की प्रतीक्षा करनी है), और तथ्य यह है कि कुछ उपयोगकर्ता git svn चलाने में सक्षम नहीं हो सकते हैं (क्योंकि यह उनकी मशीन पर स्थापित नहीं है), जिसका अर्थ है कि वे/रिपटिंग करते समय अन्य भंडार को अपडेट नहीं कर सकते हैं।

मैं इन समस्याओं को कैसे हल कर सकता हूं? सबवर्सन और गिट हुक कैसा दिखेंगे?

उत्तर

12

यहाँ है कि मैं क्या लेकर आए हैं:

  1. git-svn भंडार बनाएं यदि वह पहले से मौजूद नहीं है:

    git svn init --std-layout <svn_url> <git-svn_path> 
    

    master शाखा trunk ट्रैक करने के लिए अपने आप बन जाता ।

  2. सबवर्सन ट्रैकिंग शाखाओं के साथ नाम अस्पष्टता से बचने के लिए मूल सबवर्सन शाखाओं remotes/svn/<branch name> के रूप में दिखाई जाने वाली: नव निर्मित git-svn भंडार के पास जाकर

    git config svn-remote.svn.fetch trunk:refs/remotes/svn/trunk 
    git config svn-remote.svn.branches branches/*:refs/remotes/svn/* 
    git config svn-remote.svn.tags tags/*:refs/remotes/svn/tags/* 
    
    rm .git/refs/remotes/* 
    git svn fetch 
    
  3. चलाने प्रत्येक के लिए एक सबवर्सन ट्रैकिंग शाखा बनाएं तोड़फोड़ शाखा:

    for BRANCH in $(svn ls <svn_url>/branches/); do 
        git branch $BRANCH remotes/svn/$BRANCH 
    done 
    
  4. सुनिश्चित करें कि कोई गैर तोड़फोड़ ट्रैकिंग शाखाओं केंद्रीय Git भंडार पर बनाए गए हैं:

    # Used by hooks/update: 
    git config hooks.denyCreateBranch true 
    git config hooks.allowDeleteBranch false 
    
    cp .git/hooks/update.sample .git/hooks/update 
    chmod +x .git/hooks/update 
    
  5. केंद्रीय Git भंडार करने के लिए जोर दे रहा की अनुमति दें:

    git config receive.denyCurrentBranch ignore 
    git config receive.denyNonFastForwards true 
    git config push.default current 
    

    और बाद प्राप्त हुक रीसेट और सबवर्सन के लिए प्रतिबद्ध भेजने के लिए बनाने के लिए:

    cat .git/hooks/post-receive 
    
        #!/bin/sh 
    
        date >> receive.log 
        git reset --quiet --hard 
        while read LINE 
        do 
         BRANCH=${LINE##*/} 
         echo Updating $BRANCH 
         git checkout --quiet --force $BRANCH 
         git svn dcommit 
        done 2>&1 | tee -a receive.log 
        git checkout --quiet --force master 
    
    chmod +x .git/hooks/post-receive 
    

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

    cat .git/hooks/svn-rebase-all 
    
        #!/bin/sh 
    
        date >> .git/svn-rebase.log 
        git reset --quiet --hard 
        for REF in .git/refs/heads/* 
        do 
         BRANCH=${REF##*/} 
         echo Updating $BRANCH 
         git checkout --quiet --force $BRANCH 
         git svn rebase 
        done 2>&1 | tee -a .git/svn-rebase.log 
        git checkout --quiet --force master 
    
    chmod +x .git/hooks/svn-rebase-all 
    

    और यह सबवर्सन से कॉल के बाद प्रतिबद्ध हुक:

    cat <svn_path>/hooks/post-commit 
    
        cd <git_path> 
        . .git/hooks/svn-rebase-all 
    
    chmod +x <svn_path>/hooks/post-commit 
    

के बजाय एक ही git-svn का उपयोग कर

  • अंत में, सबवर्सन से अपडेट प्राप्त करने हुक बनाने केंद्रीय भंडार, this answer में, एक नंगे केंद्रीय गिट भंडार और एक मध्यवर्ती गैर-बेयर git-svn भंडार का उपयोग कर सकता है। मैंने एक गैर-बेयर git-svn भंडार का उपयोग करना चुना जो कि केंद्रीय भंडार भी है।

    कोई भी <git_path> क्लोनिंग करके गिट का उपयोग करके प्रोजेक्ट पर काम कर सकता है और इसे दबाकर या <svn_url> को देखकर सबवर्सन का उपयोग कर काम कर सकता है।

  • +0

    'git config hooks.denycreatebranch false' @ Daniel क्या आपका मतलब" सत्य "था? – basin

    +0

    @ बासिन हां, मुझे ऐसा लगता है। धन्यवाद। –

    4

    आप प्रत्येक डेवलपर को सीधे git-svn का उपयोग करना सीखने के साथ बेहतर हैं। आप जो भी खोज रहे हैं उसे मजबूत रूप से लागू करने में सक्षम होने के लिए गिट और एसवीएन मॉडल के बीच एक प्रतिबाधा विसंगति का बहुत अधिक उपयोग है। एकमात्र तरीका यह है कि आप इसे लगभग भरोसेमंद तरीके से काम करने के लिए भी प्राप्त कर सकते हैं, उसी तरह के प्रतिबंधों को लागू करना होगा जो git-svn होगा, लेकिन अधिक चलने वाले हिस्सों के साथ जो टूट सकता है। मेरी राय में, आपकी संशोधन नियंत्रण प्रणाली ऐसी चीज नहीं है जिसे आप केवल आंशिक रूप से विश्वसनीय बनाना चाहते हैं।

    वैकल्पिक रूप से बस एसवीएन को पूरी तरह से डुबोएं और यदि संभव हो तो गिट को सभी तरह से ले जाएं।

    +1

    मैं अपनी टीम को गिट में पूरी तरह से स्थानांतरित करने की योजना बना रहा हूं, लेकिन मैंने सोचा कि धीरे-धीरे चाल गिट-एसवीएन अनुमति एक बड़ा फायदा है। मुझे लगता है कि दूसरी टीम को मेरे गिट-एसवीएन क्लोन की एक पूरी प्रतिलिपि बनाना होगा, और गिट svn dcommit और git svn खुद को रीबेज करें। –

    +2

    यदि एकाधिक गीट रिपोज एक केंद्रीय svn repo से पुश/पुल करने के लिए git-svn का उपयोग कर रहे हैं, जो मुझे विश्वास है कि यहां क्या अनुशंसा की जा रही है, तो उन गिट रेपो के बीच सीधे धक्का देना/खींचना मुश्किल होगा। ऐसा इसलिए है क्योंकि 'गिट एसवीएन रिबेस' के दौरान गिट शाखाओं का पुन: विश्राम किया जाता है। –

    +0

    यह सही है, और यह भविष्य में एक शुद्ध गिट कॉन्फ़िगरेशन में संक्रमण को भी कठिन बनाता है, क्योंकि प्रत्येक को पैच बनाने और उन्हें नए केंद्रीय गिट भंडार से नए क्लोन किए गए भंडारों पर लागू करके अपने गिट भंडारों को "माइग्रेट" करना होगा। –

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