2015-11-25 9 views
5

के बिना एक निर्मित SVN शाखा प्राप्त करते समय मैं अपने अपस्ट्रीम svn भंडार के साथ निम्न स्थिति है:GIT SVN: गलत मर्ज माता पिता

मैं एक svn शाखा बनाया है और जो वास्तव में एक घुमावदार इतिहास के लिए नेतृत्व इस पर कुछ काम किया है। इसलिए मैंने इसे फिर से हटा दिया, गिट काम करता है, जिसने मुझे इतिहास को काफी साफ करने की अनुमति दी।

एक बार जब मैंने अपनी पैच श्रृंखला तैयार की, तो मैंने svn copy का उपयोग करके मेरी शाखा को पुनः प्राप्त किया, इसके बाद git svn fetch। विचार यह था कि मैं साफ किए गए इतिहास को नए svn शाखा पर पुनर्जीवित कर दूंगा, ताकि मैं आसानी से git svn dcommit के साथ इसे प्रकाशित कर सकूं।

हालांकि, git svn fetch जो मैंने अपेक्षित नहीं किया था। यह मेरी अपेक्षा (नकली git log --oneline --decorate --graph उत्पादन) है:

* xxxxxxx (svn-branch) 
* xxxxxxx (svn-parent-branch) 
... 
somewhere further down, unrelated to the above 
* xxxxxxx (old-svn-branch-head) 

लेकिन यह मैं क्या मिल गया है:

* xxxxxxx (svn-branch) 
|\ 
| * xxxxxxx (svn-parent-branch) 
| 
* xxxxxxx (old-svn-branch-head) 

जैसा कि आप देख, git svn fetch पूरी तरह से सच है कि svn शाखा नष्ट कर दिया गया, मानचित्रण को नजरअंदाज कर दिया svn पुनर्निर्माण git में विलय प्रतिबद्ध करने के लिए प्रतिबद्ध है। अब, मैं इसके बारे में चिंतित नहीं हूं, अगर इसका कोई परिणाम नहीं था, लेकिन दुर्भाग्यवश, गलत कनेक्शन git के विलय एल्गोरिदम को भ्रमित करता है, जिससे नई शाखा आधार प्रतिबद्धता में पुन: प्रयास करते समय फर्जी मर्ज विवाद पैदा होते हैं।

तो मेरे सवाल है: मैं कैसे को लुभाने कर सकते हैं git svn fetch नई शाखा आधार गलत माता पिता के साथ प्रतिबद्ध है, या किसी भी तरह एक तरीका है कि मैं git svn dcommit साथ मेरा सामान प्रकाशित करने की क्षमता को बनाए रखने में मेरी Git रेपो ठीक ऊपर लिंक नहीं करने के लिए? बेशक, मैं हमेशा पूरी चीज को फिर से हटा सकता हूं, और एक अलग नाम के साथ एक नई svn शाखा बना सकता हूं, लेकिन मैं सोच रहा था कि बेहतर समाधान मौजूद है या नहीं।

+0

'svn-branch' की स्थिति क्या है? क्या यह आपकी अपेक्षाओं के अनुसार है? तब मैं नहीं देखता कि आप केवल 'svn-branch' के शीर्ष पर आपके द्वारा गिट-एड का रीबेज क्यों नहीं कर सकते हैं। क्या आप 'git rebase -i --onto svn-branch ' कहकर पूर्ण नया इतिहास देखते हैं? –

+0

@MykolaGurov 'svn' शाखा ठीक है। मैंने पुराने राज्य को 'svn rm' के साथ हटा दिया, फिर शाखा को' svn copy 'के साथ फिर से बनाया। दोनों शुद्ध 'svn' संचालन थे, और दोनों बिल्कुल अपेक्षित परिणाम दिखाते हैं। साथ ही, जैसा कि अपेक्षित था, 'गिट diff svn-parent-branch svn-branch' कोई आउटपुट उत्पन्न नहीं करता है। हालांकि, 'पुरानी-एसवीएन-शाखा-हेड' के माध्यम से फर्जी कनेक्शन के कारण 'svn-parent-branch' से' svn-branch' पर वापस आने पर मुझे विलय विवाद मिलते हैं; रिकर्सिव मर्ज रणनीति गलत कनेक्शन के आधार पर गलत विलय आधार की गणना करने लगती है (यह एक बहुत ही सक्रिय परियोजना है)। मुझे पता है कि यह एक असाधारण स्थिति है :-( – cmaster

+0

शायद मुझे कुछ याद आ रहा है, लेकिन आप प्रदर्शन के लिए प्रयास किए जाने के रूप में स्पष्ट रूप से सभी बिंदुओं को परिभाषित कर सकते हैं।फिर दिया गया कि 'svn-parent-branch'' पुरानी-svn-branch-head 'से नहीं उतरता है और न ही आप रीबेज करने के लिए प्रतिबद्ध हैं, मैं किसी भी मुद्दे की अपेक्षा नहीं करता। लेकिन फिर हां, आप हमेशा एक अलग नाम के साथ एक नई शाखा बना सकते हैं और इस मुद्दे से बच सकते हैं। गिट-एसवीएन गैर-सतत एसवीएन शाखा इतिहास पर बुरा हो जाता है। –

उत्तर

2

मुझे एक समान स्थिति का सामना करना पड़ा और अभी भी इस व्यवहार को बंद करने का कोई तरीका नहीं मिला (--no-follow-parent पूरी शाखा ट्रैकिंग बंद कर देता है, जो मैं नहीं चाहता)।

मैंने git replace --graft के साथ फिक्सिंग इतिहास समाप्त कर दिया। यह एक प्रतिस्थापन प्रतिबद्धता और keeps its children unchanged बनाता है।

* svn-branch 
| 
* svn-parent-branch 
... 
* old-svn-branch-head 

तुम अब भी देख सकते हैं मूल gitk --all विकल्प के साथ प्रतिबद्ध: के बाद की जगह (। पूर्व git replace --graft svn-branch svn-parent-branch) इस तुम क्या देखते है।

* svn-branch (replacement) 
| 
| * svn-branch (original) 
|/| 
* | svn-parent-branch 
| | 
| * old-svn-branch-head 
... 
+0

वाह, मुझे अभी तक 'गिट प्रतिस्थापन' के बारे में पता नहीं था। अगर आप मुझसे पूछें तो बहुत हैक की तरह लग रहा है 8-) फिर भी, यह समस्या के लिए एक उपयोगी समाधान प्रतीत होता है। – cmaster

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