2009-11-05 17 views
18

यदि आप इसे वापस मर्ज करने से पहले हमेशा एक सुविधा शाखा सिंक्रनाइज़ करते हैं। आपको वास्तव में --reintegrate विकल्प का उपयोग क्यों करना है?पुनर्वितरण विकल्प वास्तव में कब आवश्यक है?

सबवर्सन पुस्तक का कहना है:

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

तो --reintegrate विकल्प केवल परिवर्तन है कि सुविधा के लिए अद्वितीय हैं विलीन हो जाती है डाली। लेकिन यदि आप हमेशा मर्ज करने से पहले सिंक्रनाइज़ करते हैं (जो फीचर शाखा पर किसी भी टकराव से निपटने के लिए एक अनुशंसित अभ्यास है), तो शाखाओं के बीच केवल परिवर्तन ही बदलाव शाखा के लिए अद्वितीय हैं, है ना? और अगर सबवर्सन पहले से ही लक्ष्य शाखा पर मौजूद कोड को मर्ज करने का प्रयास करता है, तो यह कुछ भी नहीं करेगा, है ना?

a blog post में, मार्क Phippard लिखते हैं:

अगर हम उन synched संशोधन शामिल है, तो हम वापस परिवर्तन है कि पहले से ही ट्रंक में मौजूद मर्ज करें। यह अनावश्यक और भ्रमित संघर्ष पैदा करता है।

क्या पुनर्जन्म छोड़ने का एक उदाहरण मुझे अनावश्यक संघर्ष देता है?

उत्तर

10

मुझे बताएं कि --reintegrate बिल्कुल जरूरी है।

निम्नलिखित उपयोग केस पर विचार करें।

  1. आप परियोजना p1तहत p1/ट्रंक है। परियोजना एक नई शाखा, p1/शाखाओं/br1
  2. ट्रंक में स्टे बनाएँ फ़ाइल, readme.txt, एक पंक्ति "पंक्ति 1" के साथ <
  3. है। readme.txt पर लाइन "लाइन 2" जोड़ें और ट्रंक
  4. p1/branches/br1 शाखा पर स्विच करें। सिर पर अपडेट करें।
  5. ट्रंक से इस शाखा में मर्ज करें (ट्रंक परिवर्तन लेने के लिए)।
  6. प्रतिबद्ध p1/branches/br1 शाखा
  7. ट्रंक में स्विच करें को मर्ज करने के परिणाम readme.txt
  8. में line1 और line2 होना चाहिए। सिर पर अपडेट करें।
  9. से p1/branches/br1 to trunk.
    1. मर्ज आप line1, line2 और readme.txt में line2 देखेंगे। तो, आपके पास "line2" दो बार गलत है। एसवीएन कोई संघर्ष नहीं दिखाता है। तो, यह बहुत खतरनाक है क्योंकि कोई त्रुटि के साथ निष्पादित विलय और आप इस धारणा के तहत हैं कि सब कुछ ठीक है।

यहाँ समाधान है कि चरण 9 मर्ज --reintegrate विकल्प का उपयोग किया जाना चाहिए है। रीइन्टेगेट विकल्प ट्रंक के साथ br1 की तुलना करने के लिए एसवीएन को बताता है और केवल br1 ट्रंक में परिवर्तन लागू करता है। इस विशेष मामले में हमने br1 में कोई बदलाव नहीं किया है। ट्रंक में नतीजा दो पंक्तियों "लाइन 1" और "लाइन 2" होना चाहिए।

एक और उपयोगी टिप्पणी। शाखा p1/branches/br1 का उपयोग चरण 9 के बाद विकास के लिए नहीं किया जाना चाहिए। यदि आप शाखाओं में विकास जारी रखना चाहते हैं, तो एक नई शाखा बनाएं, उदाहरण के लिए, p1/branches/br2। ट्रंक से p1/branches/br1 पर एक और विलय कई संघर्षों का कारण बनता है।

+2

मैंने अभी एसवीएन 1.7.0 का उपयोग करके यह परीक्षण किया है और मुझे यह नहीं दिख रहा है। इसके बजाय मैं जो देखता हूं वह एसवीएन स्वचालित रूप से विलय की दिशा के बावजूद संबंधित शाखाओं में मौजूद परिवर्तनों को फ़िल्टर कर रहा है (शाखा या ट्रंक से शाखा में ट्रंक)। क्या इस क्षेत्र में एसवीएन का व्यवहार इस तरह से बदल गया है जो दस्तावेज़ीकरण में प्रतिबिंबित नहीं होता है? – Neutrino

+2

मैंने नेटबीन्स 7.3.1 (जो एसवीएन 1.7 का उपयोग करना चाहिए) के साथ अपना परीक्षण भी किया है, मेरा एसवीएन सर्वर 1.6.17 है और मुझे डुप्लिकेट पंक्तियों में कोई समस्या नहीं है। – betatester07

0

मुझे लगता है कि मार्क का मतलब है कि यह संशोधित की गई दो फाइलों की तुलना करने से बचाता है, एक शाखा से फिर से हटने के लिए और ट्रंक में इसकी इसी फ़ाइल को पुन: एकीकृत करने के लिए, दोनों को सिंक्रनाइज़ किया गया है (और स्थानीय रूप से अपनी संबंधित शाखा में नहीं बदला गया है)।

मान लेते हैं हम trunk/a.c और branches/dev/a.c, trunk/a.c कुछ बिंदु पर संशोधित के साथ है और किसी मर्ज के साथ बाद में शाखा में फिर से एकीकृत करते हैं। जैसा कि आपने बताया है, सबकुछ वापस ट्रंक में डालने से पहले ऐसा करना एक अच्छा अभ्यास है।

तो अगला कदम ट्रंक पर वापस विलय हो जाएगा, जहां a.c दोनों तरफ से "अलग" हैं क्योंकि वे दोनों स्थानों पर बदल गए हैं। विकल्प के बिना एक अनावश्यक तुलना होगी, --reintegrate वेरस को एसवीएन को यह देखने में मदद मिलेगी कि परिवर्तन सिर्फ स्थानीय नहीं था।

+2

हां, मैं "अनावश्यक तुलना" को समझ सकता हूं। लेकिन "अनावश्यक संघर्ष" नहीं, जो दस्तावेज के बारे में बात कर रहा है। –

0

यह ’ --reintegrate — का उपयोग करने के लिए कभी भी आवश्यक नहीं है ’ एस बस एक उपनाम है। आप trunk की एक काम की नकल है, तो फिर

svn merge --reintegrate url://feature-branch workingcopy

svn merge url://trunk url://feature-branch workingcopy

आप उपयोग कर सकते हैं जो भी आप के साथ अधिक सहज हो के समान है।

+0

हम्म। मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि आप इस पर गलत हैं। कम से कम svnbook इसकी एक अलग तस्वीर देता है। http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.stayinsync – Jonik

+0

@ माइकल: क्या आप वाकई इसके बारे में निश्चित हैं? एसवीएन दस्तावेज में यह स्पष्ट है कि व्यवहार अलग है, क्या आपका मतलब यह है कि यह स्वचालित रूप से दो यूआरएल निर्दिष्ट करने से पता लगाता है? – RedGlyph

+3

यह ओपी में निर्दिष्ट लिंक के अनुसार है। "नया पुनर्वितरण विकल्प 2-यूआरएल विलय का एक लघु संस्करण है ... दूसरे शब्दों में, पुन: वर्गीकरण केवल एक नया वाक्यविन्यास और कुछ सुरक्षा जांच है।" मैं क्षमा चाहता हूं, लेकिन मेरे पास इस विकल्प के साथ पहले से अनुभव नहीं है । –

3

--reintegrate का उपयोग करना कभी भी आवश्यक नहीं है; यह एक सुविधा है।यदि trunk से feature-branch में आपके हालिया विलय trunk में हुए सभी परिवर्तनों को विलय कर चुके हैं, क्योंकि आपने rev को संशोधित करने के लिए ब्रांच किया है, तो आप निम्न आदेश का उपयोग कर सकते हैं।

svn merge url://[email protected] url://feature-branch . 

ध्यान दें कि इस आदेश का कोई बकाया परिवर्तन के साथ trunk की एक अप-टू-डेट काम कर प्रतिलिपि की जड़ से चलाया जाएगा प्रतिबद्ध किया जाना है।

मुझे अपने उत्तर का विस्तार करने के लिए सीधे सवाल का जवाब दें "क्या दोबारा छोड़ने का एक उदाहरण मुझे अनावश्यक संघर्ष देता है?"

यहां लेख का अर्थ है "यदि हम उन समेकित संशोधन शामिल करते हैं, तो हम ट्रंक में पहले से मौजूद परिवर्तनों को वापस विलय करते हैं। इससे अनावश्यक और भ्रमित संघर्ष पैदा होते हैं।"

synched संशोधन इस प्रकार दिखाई देगा सहित:

svn merge -r N:HEAD url://feature-branch . 

कहाँ . ट्रंक और N की एक साफ काम कर प्रति है संशोधन कि feature-branchtrunk से बनाया गया था। feature-branch के बाद trunk से विलय किए गए परिवर्तनों सहित, मर्ज कमांड feature-branch पर किए गए सभी परिवर्तनों को विलय कर देता है, क्योंकि इसे ब्रांच किया गया था। इसका मतलब है कि trunk पर पहले से किए गए परिवर्तनों को उपरोक्त विलय में शामिल किया जाएगा। आप trunk में परिवर्तन लागू करने के लिए सबवर्सन को बताएंगे जो वास्तव में trunk में उत्पन्न हुआ था, जिसके परिणामस्वरूप संघर्ष हुए।

+0

ठीक है, यही वह है जो मुझे समझ में नहीं आता है। शाखा और ट्रंक दोनों में मौजूद परिवर्तन क्यों संघर्ष करेंगे, यदि वे परिवर्तन समान हैं? –

+2

@ टोर, यदि आप शाखा में संशोधित कोड में कोई बदलाव किए हैं तो आप एक संघर्ष देखेंगे। दूसरे शब्दों में, वे परिवर्तन अब समान नहीं हो सकते हैं। कल्पना कीजिए कि आपने शाखा में सिंक किए गए ट्रंक पर 5 लाइनें जोड़े हैं, और फिर उन्हें शाखा में संशोधित किया है। एक मर्ज तब एक संघर्ष दिखाएगा: शाखा पर 5 अलग-अलग लाइनों के ट्रंक पर 5 लाइनें। लेकिन अगर आप इस्तेमाल करते हैं - कम करें, तो यह शाखा पर अंतर को ध्यान में रखेगा और बिना किसी संकेत के विलय करेगा। –

+0

क्या इसका मतलब यह है कि जब बिना पुनर्निर्मित किए विलय करते हैं, तो "svn merge -r 1: 100 url: // सुविधा-शाखा" कहें। url में किए गए सभी परिवर्तन पाएंगे: // सुविधा-शाखा 1 से संशोधित 100 से, और उनमें से प्रत्येक को लागू करें। एक एक करके। पुनर्निर्मित होने के साथ, एसवीएन केवल 100 और संशोधित 1 के बीच के अंतर की तुलना करेगा, और इन अंतरों को परिवर्तन के रूप में देखें, फिर लागू करें। ? – CarmeloS

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