2008-12-08 10 views
51

एक SVN रेपो के रूप में मेरे भंडार का इलाज, मैं मिलता है:मैं एक svn कैसे रख सकता हूं: git-svn का उपयोग कर बाहरी अप टू डेट?

svn co http://myrepo/foo/trunk foo 
... 
foo/ 
    bar/ 
    baz/ -> http://myrepo/baz/trunk 

एक Git रेपो के रूप में यह इलाज, मैं मिलता है:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags 
... 
foo/ 
    bar/ 

मैं कहीं और मेरे स्थानीय मशीन baz क्लोन और एक सिमलिंक जोड़ सकते हैं , लेकिन यह सिर्फ एक हैक है। क्या git svn rebase स्वचालित रूप से उन परिवर्तनों को खींचने का कोई तरीका है जब यह सब कुछ अपडेट करता है, जैसे svn up करता है?

+0

मैं जानता हूँ कि मैंने कहीं कैसे Git submodules के साथ इस सेट अप करने के बारे में पढ़ा है, लेकिन मैं नहीं मिल सकता है संपर्क। – JesperE

उत्तर

22

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

24

मैंने देखा है कि git-svn के साथ svn externals को एकीकृत करने का सबसे अच्छा माध्यम यह script है, जो आपके बाहरी को .git_externals/निर्देशिका में क्लोन करता है और सिम्लिंक बनाता है और आपको आवश्यक फ़ाइलों को बहिष्कृत करता है। मुझे यह एक सरल और सीधा समाधान मिल गया है। YMMV।

गीट-एसवीएन के साथ svn externals से निपटने के लिए अन्य विकल्पों में से older overview है। मेरे लिए वे थोड़ी अधिक जटिल और बाद के गिट उपयोग के तहत तोड़ने के लिए उत्तरदायी दिखते हैं।

+0

ऐसा लगता है कि मेरे लिए काम नहीं करना है (यहां बाहरी एक ही भंडार के सापेक्ष लिंक हैं)। –

1

मैंने यह सब संभालने के लिए "सरल" पर्ल स्क्रिप्ट लिखने का फैसला किया मेरे लिए सामान मैंने इसे हाल ही में जिथब में रखा है, इसे आज़माएं, शायद यह मदद करेगा: http://github.com/sushdm/git_svn_externals/

यह अनिवार्य रूप git-svn है सभी बाहरी पाया के लिए क्लोन, और इतना है कि आप अभी भी उपयोग कर सकते हैं यह रिकर्सिवली उनके लिए लग रहा है, क्लोन, उन्हें उचित स्थानों में सिमलिंक और शामिल नहीं सभी .git_externals dirs और सिमलिंक 'Git SVN dcommit'।

शुभकामनाएं।

4

मैंने एक स्क्रिप्ट भी बनाई (दोनों पर्ल और रुबी वेरिएंट उपलब्ध हैं) जो मेरे लिए यह करता है, यह http://github.com/liyanage/git-tools/ पर है।

  • रिकर्सिवली सभी SVN बाहर की जाँच करता है: बाहरी
  • एक विशाल भंडार का क्लोन आधे रास्ते के माध्यम से रोकता मामले में बार-बार चलाया जा सकता है। मुझे बहुत कुछ हुआ। यह उठाता है जहां यह छोड़ दिया।
  • जोड़ता सभी SVN: प्रविष्टियों यह .git को सामना करना पड़ता है पर ध्यान न दें/जानकारी/बहिष्कृत
  • को पहली बार चलाने के बाद नियमित रूप से चला जा सकता है: बाहरी यह पाता है और प्रक्रियाओं .git करने के लिए/जानकारी/बहिष्कृत
  • सभी SVN जोड़ता है प्रविष्टियां svn करें: सभी क्लोन किए गए उप-सैंडबॉक्स में रीबेस करें, नए बाहरी और नए svn खोजें:

अद्यतन: मैं अब इस स्क्रिप्ट को बनाए रख रहा हूं। http://liyanage.github.com/git-tools/

+0

मुझे दुख की बात है कि आपके टूल्स काम पर नहीं आ सके। –

+1

मैं जानना चाहता हूं कि आपके लिए क्या काम नहीं किया है, इसलिए मैं स्क्रिप्ट को बेहतर बना सकता हूं। क्या आप मुझसे संपर्क कर सकते हैं? –

+0

बहुत सारे कांटे हैं। क्या किसी को पता है कि उनमें से कौन सा msysgit के साथ विंडोज़ पर काम करता है? लिंक संस्करण बस लटकता है। – axk

4

मैं बस एक छोटी स्क्रिप्ट जो checkouts वर्तमान के सभी svn:externals लिखा है: रिकर्सिवली क्लोनिंग और एक SVN भंडार है, साथ ही अन्य Git-संबंधी सुविधाओं अद्यतन करने के लिए अपनी कार्यक्षमता, कि मैं सक्रिय रूप से बनाए रखने कर रहा हूँ इस नई परियोजना में उपलब्ध है रूट निर्देशिका में HEAD और उन्हें गिट भंडार से बाहर कर दिया गया है।

इसे .git/hooks/post-checkout पर रखें और जब भी पेड़ में परिवर्तन होता है, तो यह बाहरी चेकआउट अद्यतित रखेगा, उदाहरण के लिए git svn rebase या git-checkout के कारण।

#!/bin/bash 
set -eu 

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p') 
git svn -r${revision} propget svn:externals | head -n-1 | { 
    while read checkout_args 
    do 
     checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3) 
     svn checkout ${checkout_args} 
     if [ -z $(grep ${checkout_dirname} .git/info/exclude) ] 
     then 
      echo ${checkout_dirname} >> .git/info/exclude 
     fi 
    done 
} 
+1

+1 जो कुछ विंडोज गिट पर लगभग काम करता है। मुझे इसे थोड़ा सा ट्विक करना पड़ा, लेकिन विंडोज़ के लिए यह सबसे अच्छा समाधान है। – pms1969

+1

@ pms1969: tweaked संस्करण के लिए स्रोत? – Carl

1

इस अजगर स्क्रिप्ट https://bitbucket.org/nytmyn/gitsvnext/overview

बाहरी SVN चेकआउट करने की कोशिश अपने Git भंडार में निम्नलिखित चला

python /../gitsvnext/run update 

रन इस को पता है कि .git/जानकारी के लिए डाल करने के लिए/बाहर निकालने के

python /../gitsvnext/run list 
+0

आप इसे किस फ़ोल्डर के खिलाफ चलाने के लिए करेंगे? यदि मेरा मुख्य svn भंडार/पथ/से/रेपो है और बाहरी को/path/to/repo/myexternals/फ़ोल्डर के अंदर परिभाषित किया गया है/तो क्या मुझे स्क्रिप्ट को/path/to/repo या myexternals/फ़ोल्डर के अंदर चलाया जाना चाहिए? – bibstha

2

बस रिकॉर्ड के लिए: मैंने this का पालन किया tion और svn:externals से निपटने के लिए SmartGit का उपयोग करने का प्रयास किया।

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

दुर्भाग्यवश यह वाणिज्यिक उपयोग के लिए स्वतंत्र नहीं है (और मुझे लाइसेंस की कीमत थोड़ी अधिक है - हाँ, मैं एक cheapskate हूँ)। इसका उपयोग गैर वाणिज्यिक उद्देश्यों के लिए मुफ्त में किया जा सकता है।

0

यहां मैंने जो किया है।

सबसे पहले मैं (Git के रूप में एक ही रूट के लिए) एक खाली SVN रेपो बनाया:

svn checkout --depth empty http://path/to/repo . 

यह Git जड़ में खाली SVN रेपो बनाया। बिंदु यह है कि एसवीएन बाहरी गुण होते हैं।

अगला मैं बस केवल बाहरी जाँच (मैं पथ cygwin उपकरणों में रखा):

svn propget svn:externals | sed -e 's//.\//' | sed -e 's/\'//g' | xargs -L1 svn co