Fork और GitHub में Google कोड तोड़फोड़ भंडार को सिंक्रनाइज़ करें


131

मैं एक Google कोड सबवर्सन रिपॉजिटरी के साथ कैसे कांटा और रख सकता हूं जिसे मेरे पास एक GitHub रिपॉजिटरी में लिखने की पहुंच नहीं है?

मैं अपनी गिट रिपॉजिटरी में अपनी विशेषताओं को विकसित करने में सक्षम होना चाहता हूं, लेकिन मैं Google कोड सबवर्सन रिपॉजिटरी के खिलाफ भी सिंक्रनाइज़ करना चाहता हूं। Google कोड प्रोजेक्ट पक्ष से फ़िक्सेस प्राप्त करने के लिए।

मैं git-svn के बारे में जानता हूं और इसे ऊपर-नीचे करने के लिए इस्तेमाल किया है और एक सबवर्सन रिपॉजिटरी में डाउनस्ट्रीम पर मेरा पूरा नियंत्रण था। लेकिन मुझे नहीं पता कि गूगल कोड सबवर्सन रिपॉजिटरी के साथ तालमेल कैसे रखा जाए।

जवाबों:


178

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

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

अब जब आपके पास यह है, तो कभी-कभी आपको गिट के साथ तोड़फोड़ के भंडार को सिंक्रनाइज़ करना होगा। यह कुछ इस तरह दिखेगा:

git svn rebase
git push

Gitk या जो भी हो, यह कुछ इस तरह दिखेगा:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

और जब आप दौड़ेंगे git svn rebase, तो आपके पास यह होगा:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

इसलिए अब दौड़ना git pushउन लोगों को GitHub की ओर धकेलेगा, जो [रिमोट / मूल / मास्टर] हैं शाखा है। और आप पहले ASCII कला आरेख में परिदृश्य पर वापस आ जाएंगे।

अब समस्या यह है कि आप अपने बदलाव को मिक्स में कैसे काम करेंगे? विचार यह है, आप कभी भी उसी शाखा पर प्रतिबद्ध नहीं होते हैं जो आप git-svn-rebase-ing और git-push करते हैं। आपको अपने परिवर्तनों के लिए एक अलग शाखा की आवश्यकता है। अन्यथा, आप अपने बदलावों को तोड़फोड़ करने वालों के ऊपर समाप्त कर देंगे, जो किसी को भी परेशान कर सकते हैं जो आपके गिट रिपॉजिटरी को क्लोन करता है। मेरे पीछे आओ? ठीक है, इसलिए आप एक शाखा बनाते हैं, चलो इसे "सुविधाएँ" कहते हैं। और आप एक प्रतिबद्ध बनाते हैं और इसे GitHub से फीचर शाखा में धकेल देते हैं। आपका gitk कुछ इस तरह दिखेगा:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

यहाँ आपने अपनी सुविधाओं की शाखा को Google कोड शाखा से आगे आने वाले एक-दूसरे को मिलाया है, है ना? तो क्या होता है जब आप Google कोड से नए सामान को शामिल करना चाहते हैं? आप git svn rebaseपहले दौड़ेंगे और इसे प्राप्त करेंगे:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

यदि आप git pushबाहर मास्टर करते हैं, तो आप मास्टर के रूप में एक ही बिंदु पर होने वाले [उपाय / मूल / मास्टर] की कल्पना कर सकते हैं । लेकिन आपकी सुविधा शाखा में परिवर्तन नहीं हैं। आपकी पसंद अब मास्टर को फीचर्स, या रीबेज फीचर्स में मर्ज करना है। एक मर्ज इस तरह दिखेगा

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

तब आप सुविधाओं को GitHub पर धकेल देते हैं। मैंने अंतरिक्ष को बचाने के लिए मास्टर के लिए छूट छोड़ दी है, वे [मास्टर] के समान बिंदु पर होंगे ।

रिबास दृष्टिकोण थोड़ा अधिक दुष्ट है - आपको धक्का देना होगा - प्रवर्तन के रूप में आपका धक्का एक तेजी से आगे मर्ज नहीं होगा (आप किसी व्यक्ति के नीचे से सुविधा शाखा को खींच लेंगे जिसने इसे क्लोन किया था)। यह वास्तव में ऐसा करने के लिए ठीक नहीं माना जाता है, लेकिन यदि आप दृढ़ हैं तो कोई भी आपको रोक नहीं सकता है। यह कुछ चीजों को आसान भी बनाता है, जैसे कि जब पैच को थोड़ा उल्टा रूप में स्वीकार किया जाता है। यह संघर्ष के साथ खिलवाड़ होने से बचाएगा, आप बस उलट-पुलट कर सकते हैं। वैसे भी, एक छूट इस तरह होगी:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

और फिर आपको वह करना होगा git push --force। आप यह देख सकते हैं कि आपको इसे मजबूर करने की आवश्यकता क्यों है, इतिहास में एक बड़ा पुराना धर्म है [रीमोट / उत्पत्ति / सुविधाएँ] से नए वर्तमान पोस्ट-रिबेस [फीचर्स]

यह सब काम करता है, लेकिन यह बहुत प्रयास है। यदि आप एक नियमित योगदानकर्ता बनने जा रहे हैं, तो सबसे अच्छा शर्त यह होगा कि आप थोड़ी देर के लिए इस तरह से काम करें, कुछ पैच अपस्ट्रीम भेजें और देखें कि क्या आप सबवर्सन के लिए प्रतिबद्ध हो सकते हैं। असफल होना, शायद GitHub के लिए आपके परिवर्तनों को बाहर नहीं धकेलता है। उन्हें स्थानीय रखें और कोशिश करें और उन्हें ऊपर की ओर वैसे भी स्वीकार करें।


उत्कृष्ट निर्देशों के लिए धन्यवाद। ( gitnoob यहाँ।) त्वरित प्रश्न। मैंने एक बड़े एसवीएन रेपो के खिलाफ यह किया और यह ~ 141 मेगाबाइट पर आ गया। मैंने इसे गीथब पर धकेल दिया और फिर इसे वापस नीचे कर दिया, और यह 130 मेगाबाइट पर आ गया। मैं git gcदोनों पर भागा । अंतर का क्या हिसाब हो सकता है?
एमपोंटिलो

... पता लगा लिया। मुझे जरूरत थी git push origin --mirror
mpontillo

एक आकर्षण की तरह काम किया है, अब मुझे सिर्फ मेरे साथ github का उपयोग करने के लिए मूल googlecode
देवों

यह मेरे लिए -sविकल्प के साथ काम नहीं करता था git svn clone, लेकिन इसके बिना बाकी सब ठीक काम करता था।
user1027169

15

svn2github सेवा

वेबसाइट http://svn2github.com/ Github पर ( https://github.com/svn2github/projectname पर सार्वजनिक रूप से सुलभ SVN रिपॉजिटरी को फोर्क करने के लिए एक सेवा प्रदान करती है। ) । मैं इसे करने की कोशिश की; "एक दर्पण बनाएं" दबाने पर यह स्पष्ट रूप से कुछ सेकंड के लिए कुछ नहीं करता था और "त्रुटि" संदेश प्रदर्शित करता था, लेकिन यह वास्तव में काम करता था। नई रिपॉजिटरी वास्तव में बनाई गई थी, जिसमें एसवीएन रेपो से कोड था।

फिर आप अपने द्वारा बनाए गए भंडार को कांटा करेंगे, और अपने खुद के कांटे पर काम करेंगे। फिर आप अपने बगट्रैकर का उपयोग करके अपस्ट्रीम प्रोजेक्ट में अपने परिवर्तन प्रस्तुत करेंगे।

सेवा के Github उपयोगकर्ता (उदाहरण के लिए "svn2github को svn2github / haxe पर 5 घंटे पहले मास्टर करने के लिए") के तहत मौजूदा रिपॉजिटरी को देखते हुए, यह नियमित रूप से SVN रिपॉजिटरी से होने वाले परिवर्तनों को खींचता है। वेबसाइट पर सेवा कौन चलाता है, इसकी कोई जानकारी नहीं है, इसलिए मैं इसे अनिश्चित काल तक जारी रखने के लिए शर्त नहीं लगाऊंगा, लेकिन यह अभी के लिए काम करता है (और अगर यह कभी भी नीचे चला जाता है, तो आप अभी भी मैन्युअल रूप से अपने कांटे को अपडेट कर सकते हैं)।

लांच पैड

यदि आप Git और Github का उपयोग करने के लिए तैयार नहीं हैं, तो अन्य विकल्प Launchpad.net का उपयोग करना है। लॉन्चपैड स्वचालित रूप से एसवीएन (सीवीएस) रिपोजिटरी को एक व्यक्तिगत बजर शाखा में आयात कर सकता है। ऐसा करने के लिए, एक लॉन्चपैड प्रोजेक्ट बनाएं, फिर नए आयात पृष्ठ पर जाएं , सबवर्सन का चयन करें और URL (जैसे http://projectname.googlecode.com/svn/trunk/) दर्ज करें । परियोजना के आकार के आधार पर, प्रारंभिक आयात में कुछ घंटे लग सकते हैं। बाद में आयात समय-समय पर चलेगा।

अधिक प्रलेखन के लिए, लॉन्चपैड मदद पर वीसीएस आयात देखें ।


10

Google Code से GitHub तक सिंक्रनाइज़ करने के लिए एक पैदल-यात्रा fnokd.com पर उपलब्ध है । लेखक सिंक्रोनाइज़ेशन को स्वचालित करने के लिए हमेशा ऑन-रिमोट सर्वर और क्रॉन जॉब का उपयोग करता है और "विक्रेता" नामक एक GitHub शाखा में SVN ट्रंक रखता है।


2

GitHub अब सीधे तोड़फोड़ करने वाली परियोजनाओं का समर्थन करता है (देखें http://help.github.com/import-from-subversion/ )। बस एक नया रेपो बनाएं और फिर "नेक्स्ट स्टेप्स" स्क्रीन पर "सबवर्सन से इम्पोर्ट" पर क्लिक करें। यह आगे सिंकिंग का समर्थन नहीं करता है, हालांकि: /।


यह विधि अब मौजूद नहीं है
मैग्नेटिक

इसके बजाय अब import.github.com/new का उपयोग करें । Help.github.com/articles/importing-from-subversion देखें ।
क्रिस अरंड्ट

1

हम्म .. मेरी कंपनी में मैं लगभग एक ही कर रहा था। बस एक ही डायरेक्टरी में .svn और .git रेपो दोनों होने (आप इस वर्किंग कॉपी में svn रेपो और git रेपो बनाएं)।

फिर svn अप और git पुश का उपयोग करके बात की। बेशक अगर आप बहुत से काम करते हैं तो आपको हाथ से चीजें मिलानी होंगी।


ठीक है, लेकिन मैं .sata मेटा डेटा होने से बचना चाहता हूँ और उम्मीद कर रहा था कि git स्ट्रीम मास्टर के रूप में svn repos का उपयोग करने में सक्षम है
Optixx

तो क्या यह संभव नहीं है कि git-svn का उपयोग चेकआउट रेपो और git पुश को github करने के लिए किया जाए?
मर्सिन गिल

0

मुझे पूरा यकीन नहीं है कि यह क्या है जो आप चाहते हैं, लेकिन निश्चित रूप से आप एक तोड़फोड़ भंडार से खींच सकते हैं और एक ही काम करने वाली कॉपी से गिट रिपॉजिटरी को धक्का दे सकते हैं। और आप भी git svn dcommitतोड़फोड़ भंडार में वापस आ सकते हैं । आप GitHub रिपॉजिटरी सिंक को तोड़फोड़ रिपॉजिटरी के खिलाफ नहीं कर सकते, हालांकि। इसके अलावा, जब आपके पास अपनी कार्यशील प्रति है, जो अभी तक तोड़फोड़ के भंडार में नहीं है, तो आपको उन्हें फिर से जमा करने की आवश्यकता होगी यदि तोड़फोड़ के भंडार को अपडेट किया गया था, git push --forceजो आपको "नई" करने के लिए मजबूर करता है।


0

मुझे ये निर्देश यू-जी लिन के ब्लॉग पर मिले:

सबसे पहले तोड़फोड़ रिपॉजिटरी को क्लोन करें और गिट को पुश करें:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

सबवर्सन रिपॉजिटरी में कमिट करने के बाद, रन करें

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.