2010-01-29 16 views
11

तो मैं गिट का उपयोग कर रहा हूं और एक svn repo के साथ बातचीत कर रहा हूं।एक एसवीएन शाखा को ट्रंक में वापस लाने के लिए गिट-एसवीएन का उपयोग करके और शाखा में वापस ट्रंक

मैं एक SVN ट्रंक है कि इस तरह दिखता है:

A-B-C-D 

और एक SVN bug_fixes शाखा है कि कम से बी या सी प्रतिबद्ध बंद शाखाओं:

-c-d-e-f-g-h-i 

अब मैं cdefghi करता है प्राप्त करने की आवश्यकता जो मेरी एसवीएन शाखा में वापस मास्टर शाखा में हैं।

मुझे पता है कि मैं सिर्फ एक स्क्वैश प्रतिबद्ध कर सकता हूं, चलो इसे स्क्वैश स्क्वाश (जिसमें सीडीएफईजीई होगी) को कॉल करें, लेकिन ऐसा लगता है कि मुझे बग_फिक्सेस शाखा को मारना होगा और साफ-सफाई जारी रखने के लिए एक नई शाखा शुरू करनी होगी ।

यहाँ: http://blog.red-bean.com/sussman/?p=92 वे सुझाव देते हैं:

checkout शाखा।

merge शाखा में मास्टर के परिवर्तन।

Checkout मास्टर।

merge --reintegrate मास्टर पर शाखा के परिवर्तन।

विकास जारी रखें।

दुर्भाग्य से, git-svn svn के लिए किसी भी "विलय --reintegrate" कमांड को पहचानने के लिए प्रतीत नहीं होता है।

तो मैं साफ-सफाई कैसे कर सकता हूं और मास्टर सभी काम करता है, ताकि दोनों पर विकास गिट-एसवीएन के आदेशों का उपयोग कर जारी रहे?

+0

तो मूल रूप से, समाधान में से कोई भी एक सटीक एकीकरण, सभी संघर्ष में शाखा छोड़ने अगर आप इसका प्रयोग करते हैं? – Quartz

+0

स्पष्ट रूप से, इस पर वापस देखकर, मैं इन दो चीजों में से एक करता हूं: 1. svn के बिना एक गिट रेपो का उपयोग करें। 2. एक केंद्रीय svn repo का उपयोग करें, और कम सक्षम svn शाखाओं का उपयोग किए बिना, मेरे सभी विलय और गिट में पुन: प्रयास करें। अगर मुझे किसी भी शाखा को साझा करना पड़ा, तो मैं एक गिट दर्पण में ऐसा करूंगा- बिना किसी मास्टर शाखा और svn में केवल मास्टर शाखा रखें। लेकिन कुल मिलाकर यदि मैं संभव हो तो svn के साथ बांटता हूं। – Kzqai

उत्तर

7

Caveats section of the git-svn documentation ने चेतावनी दी है

सरलता के लिए और एक कम सक्षम प्रणाली (SVN) के साथ अंतरसंक्रियता, यह अनुशंसित है कि सभी git svn उपयोगकर्ताओं clone, fetch और SVN सर्वर से सीधे dcommit, और से बचने सभी git clone/pull/merge/push गिट भंडारों और शाखाओं के बीच संचालन।

Git शाखाओं और उपयोगकर्ताओं के बीच कोड का आदान प्रदान की सिफारिश की विधि git format-patch और git am, या बस dcommit SVN भंडार के लिए ing है:

लेखक एक सिफारिश प्रदान करता है।

अपनी स्थिति

git format-patch --stdout c^..i >my.patch 
git reset --hard trunk 
git am <my.patch 

जहां c और i अपने इतिहास में प्रतिबद्ध के लिए उपयुक्त पहचानकर्ता हैं करने के लिए अनुकूल।

+0

यह मुझे ट्रंक में सभी कामों को लागू करने की अनुमति देता है, लेकिन मुझे शाखा पर विकास जारी रखने की अनुमति नहीं देता है। दुर्भाग्यवश, चूंकि svn के पास एक रैखिक संशोधन इतिहास है, ऐसा लगता है कि कार्रवाई की अनुशंसित पाठ्यक्रम वास्तव में शाखा को ट्रंक में विलय करने के लिए है, फिर शाखा को हटाएं और उसी नाम का निर्माण करें। – Kzqai

1

क्या यह आपके स्थानीय सामान (<branchpoint>..i) को एसवीएन से प्राप्त नए मास्टर पर रीबेज करने का अच्छा मामला नहीं होगा?

+0

यह गिट में अच्छी तरह से काम करता है, लेकिन svn के रैखिक संशोधन इतिहास के साथ नहीं। तो आप शाखा से ट्रंक में परिवर्तन प्राप्त कर सकते हैं, लेकिन बाद में शाखा पर निरंतर विकास स्पष्ट रूप से व्यर्थ है। – Kzqai

3

ठीक है, इसलिए कुछ दृष्टिकोण है कि मैंने पाया:

git checkout your_branch 
git rebase master 
git checkout master 
git merge your_branch 

या

git checkout your_branch 
git rebase master 
git checkout master 
git merge --squash your_branch 

या

git checkout your_branch 
git rebase master 
git checkout master 
git rebase -i your_branch 

और फिर वह सब के बाद।

git svn dcommit (to commit to master) 
git branch -D your_branch 

तब (SVN से क्योंकि Git-SVN विलोपन का समर्थन नहीं करता) शाखा, हटा सकते हैं और ट्रंक से इसे पुन: और फिर चक्र शुरू करते हैं।

+0

एसवीएन से शाखा कैसे प्राप्त करें? यह वहां पर संग्रहीत है .. स्थानीय रेपो में नहीं। – holms

+0

मुझे लगता है कि यह सिर्फ "गिट svn fetch" या कुछ का मामला है। http://www.kernel.org/pub/software/scm/git/docs/git-svn.html – Kzqai

+0

मुझे लगता है कि आपको वास्तव में इसके बजाय 'git svn rebase' करना चाहिए। इसे https://git-scm.com/docs/git-svn#git-svn-emrebaseem पर प्रलेखन के अनुसार एक रैखिक इतिहास को संरक्षित रखना चाहिए – Paul

1

यदि आप विलय को कम करते हैं तो यह स्वचालित रूप से इसे 1 प्रतिबद्ध में स्क्वैश करता है। अफसोस की बात यह है कि यह आंतरिक रूप से svn: mergeinfo या --reintegrate का उपयोग नहीं करता है, इसलिए आप 'git svn branch' के माध्यम से बनाई गई शाखा के साथ सहयोग खो देते हैं।

1

आप क्या कर सकते हैं चेरी-पिक, बशर्ते आप मर्ज न करें।

परिवर्तन के बिना शाखा में दोनों बयान किए जाने चाहिए।

बशर्ते कि सी मेरे से पुराना है और आप पूरे अनुक्रम को लेना चाहते हैं।

git cherry-pick c..i 

या अलग करता

git cherry-pick c d e f g h i 
संबंधित मुद्दे