2012-03-07 19 views
8

मैं अपनी 9 परियोजनाओं को एक एसवीएन रेपो में 9 अलग-अलग गिट रेपो में ले जाने पर काम कर रहा हूं, जो गिटोलाइट द्वारा सर्वर पर प्रबंधित किया गया है और फिर एसवीएन बंद कर रहा है। के रूप में वे कोई शाखाओं या टैग तो मेरे कार्य केंद्र पर मैं एक सरल करने के लिए सक्षम था उनमें से सात आसान थे: के माध्यम सेसबवर्जन से गिट तक माइग्रेट करें, सभी शाखाओं को क्लोन करें और गिटोलाइट के माध्यम से धक्का दें?

git svn clone --stdlayout --no-metadata -A svnauthors.txt svn+ssh://[email protected]/var/subversion/project tempProject 

तब मेरे कार्य केंद्र से gitolite को धक्का दे तोड़:

git remote add origin ssh://[email protected]/project 
git push -u origin master 

और वे सब महान काम कर रहे हैं। अब अंतिम दो परियोजनाएं अधिक कठिन हैं, जिनमें से लगभग 30 टैग/शाखाएं हैं। उन परियोजनाओं में से एक के रूप में ऊपर 'Git SVN क्लोन' चलाने के बाद मैं देख रहा हूँ:

$ git branch -a 
* master 
    remotes/BatchUpload 
    remotes/clarify_breadcrumb 
    remotes/contact_type 
    remotes/contact_upload_improvements 
    remotes/file_cabinet 
    remotes/mobile 
    remotes/summary_tiles 
    remotes/summary_updates 
    remotes/tags/release-2.1.2 
    remotes/tags/release-3.0.1 
    remotes/tags/release-3.0.2 
    remotes/tags/release-3.0.2c 
    remotes/tags/release-3.1.1 
    remotes/tags/release-3.1.3 
    remotes/tags/release-3.1.4 
    remotes/tags/release-3.1.5 
    remotes/tags/release-3.1.5.UPDT 
    remotes/tags/release-3.2 
    remotes/tags/release-3.2.1 
    remotes/tags/release-3.2.2.1 
    remotes/tags/release-3.2.3 
    remotes/tags/release-3.2.4 
    remotes/tags/release-3.2.6 
    remotes/tags/release-3.2.7 
    remotes/tags/release-3.2.7.1 
    remotes/trunk 
    remotes/user_man_batch_upload 
    remotes/user_management 

अब कैसे मैं तो मैं उन्हें gitolite के माध्यम से धक्का कर सकते हैं अपने स्थानीय कार्य केंद्र पर डाउनलोड उन सभी टैग/शाखाओं करने के बारे में जाना है और एसवीएन सर्वर को स्थायी रूप से बंद करें? क्या मुझे this guide में क्या करना है, प्रत्येक शाखा और टैग के लिए 'गिट चेकआउट-बी' करना? क्या मुझे इसके लिए svn2git या कुछ अन्य टूल का उपयोग करना चाहिए?

उत्तर

11

freenode irc पर #git में एक सहायक व्यक्ति ने लिखा है मुझे एक छोटे आदेश मेरे टैग और शाखाओं SVN से Git पर कॉपी करने के लिए:

पुश शाखाओं:

printf "git push origin "; git show-ref | grep refs/remotes | grep -v '@' | grep -v remotes/tags | perl -ne 'print "refs/remotes/$1:refs/heads/$1 " if m!refs/remotes/(.*)!'; echo 

रन कमांड जो कि

पुश टैग बाहर प्रिंट:

printf "git push origin "; git show-ref | grep refs/remotes/tags | grep -v '@' | perl -ne 'print "refs/remotes/tags/$1:refs/tags/$1 " if m!refs/remotes/tags/(.*)!'; echo 

रन कमांड जो कि बाहर प्रिंट

+1

रन कमांड द्वारा आपका क्या मतलब है जो प्रिंट करता है ??? –

+0

ओह इसका आउटपुट एक कमांड है .. धन्यवाद, मेरे पास बहुत सारी शाखाएं हैं जो मुझे उलझन में डालती हैं ... –

+0

यह मेरे लिए काम करता है। लेकिन इसके लिए कोई ओटब गिट कमांड क्यों नहीं है? या, गिट पुश - गिट svn शाखाओं के लिए असफल क्यों है? – Christian

0

वे पहले से ही आपके स्थानीय वर्कस्टेशन पर हैं। जो आप देखते हैं वह केवल काम करने के संदर्भ हैं और आप जब चाहें स्थानीय शाखाओं को ट्रैक कर सकते हैं।

git branch -a 

दिखाएँ जानकारी अपने स्थानीय रेपो में है, दूरदराज के भंडार से किसी भी डेटा फ़ेच नहीं। जब आपने क्लोन किया था तो आपको वह सारी जानकारी मिली।

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

git push --tags 

आप के साथ रेपो को धक्का कर सकते हैं:: आप के साथ दूरस्थ सर्वर से अपने सभी टैग पुश कर सकते हैं

git push origin remotes/BatchUpload:BatchUpload 
+0

चल रहा है 'गिट पुश --टैग' 'सब कुछ अद्यतित "के साथ प्रतिक्रिया करता है और कोई अन्य आउटपुट,' गिट पुश मूल रिमोट/*: रेफ/हेड/* 'चलाने के साथ ही नहीं, जो माना जाता है कि आप ऊपर सूचीबद्ध हैं ? हालांकि यह उन आदेशों को चलाने के बाद सर्वर पर मौजूद किसी भी शाखा या टैग की तरह दिखता नहीं है। – xref

+0

हम्म ठीक है, तो आपको शायद उन्हें मैन्युअल रूप से या स्क्रिप्ट के साथ टैग में परिवर्तित करना होगा। यदि आप "गिट चेकआउट रिमोट/टैग/रिलीज-2.1.2" के साथ उदाहरण रिमोट/टैग/रिलीज-2.1.2 के लिए चेक आउट करते हैं, तो क्या आपको एक अलग सिर मिलता है? – ralphtheninja

+0

ऐसा लगता है कि svn से git में रूपांतरण टैग को रिमोट संदर्भ (लेकिन एक अजीब नामकरण के साथ) बनाता है, इसलिए आपको शायद ऐसा करना होगा। "गिट चेकआउट रिमोट/टैग/xyz; गिट टैग xyz;" .git/remotes/टैग फ़ोल्डर में xyz सभी फ़ाइलों के लिए। एक बार ऐसा करने के बाद, गिट पुश - टैग को उन्हें रिमोट पर धक्का देना चाहिए। और आपको शाखा संदर्भों के साथ ऐसा करना होगा, गिट चेकआउट -बी xyz रिमोट/xyz (या बस गिट शाखा xyz remotes/xyz) और गिट पुश मूल xyz सभी फ़ाइलों xgz के लिए .git/remotes फ़ोल्डर में करना होगा। जब आप पूरा कर लेंगे, तो आप फाइलों को हटा सकते हैं। – ralphtheninja

0

उपयोग svn2git। यह Git एनोटेट टैग में टैग धर्मान्तरित और इन तो ठीक से उपयोग धकेल दिया जाता है Git धक्का --tags

+1

क्या आप ओपीएस विशिष्ट समस्या को हल करने के लिए svn2git का उपयोग करने के बारे में विस्तार से बता सकते हैं? –

0

यह वही मेरे लिए काम किया है:

git push origin refs/remotes/*:refs/heads/* 

यह आदेश सभी git करने के लिए तोड़फोड़ के दौरान बनाया रिमोट धक्का माइग्रेशन, git branch -a के साथ दृश्यमान। हालांकि सभी हटाए गए/विलय वाली शाखाओं/टैग शामिल हैं!

आपको कुछ साफ अप अवांछित शाखाएं/टैग, या शायद converting branches to tags करना होगा।

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