2009-04-28 17 views
131

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

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

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

उत्तर

178

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

git svn clone http://example.googlecode.com/svn -s 
git remote add origin [email protected]: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 चल रहा है जो उन लोगों को गिटहब, [रिमोट/मूल/मास्टर] शाखा में धक्का देगा। और आप पहले ASCII कला आरेख में परिदृश्य पर वापस आ जाएंगे।

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

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

यहां आपको अपनी विशेषताओं की शाखा Google कोड शाखा से पहले कुछ काम करती है, है ना? तो क्या होता है जब आप Google Code से नई सामग्री को शामिल करना चाहते हैं? आप 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 

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

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

git rebase master features 

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

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

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

+0

धन्यवाद। (यहां 'गिट' नोब।) त्वरित सवाल। मैंने यह एक बड़े एसवीएन रेपो के खिलाफ किया और यह ~ 141 मेगाबाइट तक आया। मैंने इसे गिटूब पर धक्का दिया और फिर इसे वापस बंद कर दिया, और यह 130 मेगाबाइट तक पहुंच गया। मैं दोनों पर 'गिट जीसी' भाग गया। अंतर के लिए क्या खाता हो सकता है? – mpontillo

+0

... इसे समझ लिया। मुझे 'गिट पुश उत्पत्ति --mirror' की आवश्यकता थी। – mpontillo

+0

एक आकर्षण की तरह काम किया, अब मुझे अपने साथ github का उपयोग करने के लिए मूल googlecode devs को बताने की आवश्यकता है: D – electblake

1

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

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

+0

चलाने जा दाएं, लेकिन मैं .svn मेटा डेटा रखने से बचना चाहता हूं और उम्मीद कर रहा था कि गिट डाउन स्ट्रीम मास्टर – optixx

+0

के रूप में एक svn repos का उपयोग करने में सक्षम है तो क्या यह संभव नहीं है gitub को चेकआउट रेपो और गिट पुश करने के लिए git-svn का उपयोग करने के लिए? उत्कृष्ट निर्देशों के लिए –

0

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

10

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

2

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

+0

यह विधि अब मौजूद नहीं है – magnetik

+0

इसके बजाय https://import.github.com/new का उपयोग करें। Https://help.github.com/articles/importing-from-subversion/ देखें। –

15

svn2github सेवा

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

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

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

लॉन्चपैड

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

अधिक प्रलेखन के लिए, VCS Imports on Launchpad Help देखें।

पहले क्लोन सबवर्सन भंडार और Git करने के लिए धक्का:

0

मैं Yu-Jie Lin के ब्लॉग पर इन निर्देशों का पाया

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo 
git remote add git-foo [email protected]:username/foo.git 
git push git-foo master 

सबवर्सन भंडार में करने के बाद,

cd /path/to/git-foo 
git svn fetch 
git svn rebase 
git push git-foo master