2012-04-12 16 views
7

[अपडेट]Git-SVN से निपटने के लिए कैसे जब उपयोग करने के लिए दोनों Git और सबवर्सन

अधिक जानकारी के लिए कारण घर पर कि, मेरी कंपनी चाहते हैं यही कारण है कि मैं शुद्ध Git करने की कोशिश करता है गिट में जाने के लिए लेकिन प्रबंधक बदलाव नहीं करना चाहेंगे क्योंकि डेवलपर को अपने खुद के भंडार पर गिट के साथ ज्ञान नहीं है। तो, मैं जो करने की कोशिश करता हूं, मैं हर किसी को शुद्ध गिट का उपयोग करने की कोशिश करता हूं जबकि कोई इस सीखने के चरण के दौरान सबवर्जन में वापस विलय कर सकता है। तो, किसी आपात स्थिति में, वे अभी भी सबवर्सन का उपयोग कर सकते हैं।

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

[प्रश्न]

मैं संगठन है जो भंडार के रूप में सबवर्सन का उपयोग में हूँ, इसलिए मैं अपने व्यक्तिगत Git के रूप में यह डंप (और भविष्य में Git साथ सववर्सन की जगह उपयोग करने की योजना)

अब , मेरे पास भंडार है जो गीट और सबवर्जन (मुख्य स्रोत) दोनों का उपयोग करता है। मुझे गिट svn rebase से निपटने में समस्या है जब मुझे दोनों गिट और सबवर्सन का उपयोग करना होगा।

मेरे कार्यप्रवाह की तरह नीचे

कार्यालय

  1. भंडार पर Git-svn है इंटरफ़ेस
  2. मैं हमेशा कोड सबवर्सन को Git SVN dcommit के साथ यहां से प्रतिबद्ध है ।
  3. मैं Bitbucket

में मेरी दूरस्थ Git भंडार करने के लिए धक्का घर पर

  1. मैं Bitbucket
  2. से रिपोजिटरी क्लोन के साथ कार्य करना और Bitbucket के लिए प्रतिबद्ध

अब, कार्यालय वापस

  1. Git खींच
  2. Git SVN rebase
  3. Git SVN dcommit
  4. Git धक्का

चरण 4 में।मैं जब मैं वापस घर

जब मैं वापस घर आ, मैं उपयोग नहीं कर सकते 'Git लाने' क्योंकि शाखा पहले से ही रिबेस रहा है एक समस्या यह है कि मैं पहले ही अपनी शाखा

समस्या अब यहाँ रिबेस है,। इसलिए, मुझे गिट शाखा-डी ..... और फिर गिट चेकआउट के साथ शाखा को हटाना होगा।

तो, मैं जिस तरह से है कि हम समवर्ती उपयोग दोनों Git भंडार और सबवर्सन और जा रहा अच्छी तरह से Git के साथ के बाद किया आपरेशन Git SVN साथ rebase या Git SVN dcommit कर सकते हैं के लिए देखो।

नोट। मैं घर पर गीट-एसवीएन का उपयोग करना पसंद नहीं करूंगा। केवल गिट का उपयोग करने के लिए आगे बढ़ने की कोशिश करें।

उत्तर

0

Version Control with Git पुस्तक से समाधान मिला। पृष्ठ 295

के बजाय उपयोग स्थानीय

- मास्टर शाखा, दूरस्थ शाखा चेकआउट करने के लिए है

git checkout remote/master (Detach HEAD) 
git merge --no-ff master (merge the local master) 
git svn dcommit 
git push origin (update to git Repository) 

यह मॉडल एक व्यक्ति जो सववर्सन रिपॉजिटरी को वापस मर्ज हो जाएगा के लिए है, जबकि शुद्ध Git या शुद्ध सबवर्सन पर अन्य काम । इस तरह, गिट उपयोगकर्ता विलय समस्या के बिना गिट का उपयोग कर सकते हैं।

0

आपने उल्लेख नहीं किया कि आप सब के बाद svn क्यों रख रहे हैं। लेकिन मेरी सिफारिश एक बार और सभी के लिए एक स्वच्छ गिट रेपो से शुरू करना है। और आवश्यक समस्याओं से बचें। How to migrate SVN repository with history to a new Git repository?

बेशक

आप एक बैकअप बनाने के लिए और उसके बाद की प्रक्रिया शुरू की है:

मेरा मानना ​​है कि केसी जो Git की ओर पलायन पर सबसे अच्छा जवाब बनाई गई है।

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

+0

मैक्रो, अगर यह मेरा खुद का भंडार है, तो सब कुछ प्रबंधित करना आसान है। लेकिन जब आप बड़ी डेवलपर टीम की कंपनी में काम करते हैं। आपको जो करना है वह करना मुश्किल है। ऐसे परिनियोजन प्रणाली पर अभी भी कई मौजूद हैं। कुछ भ्रमित नहीं हो सकता है सिवाय इसके कि सब कुछ माइग्रेट करने के लिए तैयार है। – scalopus

2

ठीक है, यहां आपकी मुख्य समस्या यह है कि आप वास्तव में git pull घर से नहीं कर सकते हैं, इतिहास को फिर से लिखा गया है (वास्तव में इसे काम करना चाहिए लेकिन यह एक अनावश्यक विलय करने का प्रयास करेगा)।

उस समस्या को दूर करने का सबसे आसान तरीका git pull --rebase का उपयोग करेगा। इस तरह, आपके रिमोट शाखा की नोक के साथ घर पर किए गए कामों को विलय करने के बजाय, आप शाखा की नोक पर अपनी शाखा निर्माण के बाद किए गए हर काम को दोबारा देते हैं। गिट यह देखने के लिए पर्याप्त स्मार्ट होगा कि कुछ काम बिल्कुल ठीक हैं और उन्हें रीबेस के दौरान स्वचालित रूप से हटा दिया जाएगा।

+0

मुझे गिट पुल --rebase कमांड में दिलचस्पी है। क्या यह अभी भी काम कर रहा है अगर मैंने पहले ही गिट svn dcommit किया है? क्योंकि उसके बाद sha1 बदल गया। – scalopus

+0

जब आप 'पुल - रीबेस' करते हैं तो यह आपकी रिमोट शाखा की वर्तमान नोक पर आपके कामों को रीबेज करने का प्रयास करेगा। तो हाँ यह काम करेगा। –

0

दरअसल आपको git fetch पर सक्षम होना चाहिए, लेकिन git merge origin/branch के साथ विलय करने के बजाय आप git rebase origin/branch का उपयोग कर सकते हैं। इससे आपकी समस्या

यदि यह git fetch को आजमाने में मदद नहीं करता है तो git checkout -f -B branch origin/branch अंतिम आदेश दूरस्थ शाखा से स्थानीय शाखा पर ओवरराइट करने के लिए मजबूर होगा।

1

मुझे लगता है कि आपकी समस्या का मुख्य कारण यह है कि git svn dcommit एसवीएन प्रतिबद्ध डेटा को शामिल करने के लिए प्रतिबद्ध संदेश को बदलता है। चूंकि संदेश को प्रतिबद्धता के SHA1 में शामिल किया गया है, यह परिवर्तन पूरी तरह से अलग प्रतिबद्धता के रूप में गिट में दिखाई देता है।

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

मेरे मामले में मैंने पूरी तरह से एसवीएन एक्सचेंज के लिए समर्पित एक और गिट रेपो स्थापित किया है। मेरे पास एक क्रॉन जॉब है जो एसवीएन सर्वर के साथ हर 15 मिनट में रेपो करता है। इस तरह मुझे git svn rebase याद नहीं है।

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