मैं तोड़फोड़ में पेड़ संघर्ष क्यों कर रहा हूं?


353

मेरे पास मेरी ट्रंक की एक सुविधा शाखा थी और मेरी ट्रंक से समय-समय पर मेरी शाखा में परिवर्तन विलय कर रही थी और सब कुछ ठीक काम कर रहा था। आज मैं शाखा को वापस ट्रंक में विलय करने के लिए गया और मेरी शाखा के निर्माण के बाद मेरी ट्रंक में जो भी फाइलें जोड़ी गईं, उन्हें "वृक्ष संघर्ष" के रूप में चिह्नित किया गया। क्या भविष्य में इससे बचने का कोई उपाय है?

मुझे नहीं लगता कि इन्हें ठीक से चिह्नित किया जा रहा है।


क्या आप एक खाली भंडार से शुरू होने वाली इस समस्या को पुन: उत्पन्न करने के लिए एक नुस्खा दे सकते हैं?
विम कॉइनन

मैं कोशिश करूँगा और आज कुछ समय पाकर एक नया रेपो बनाऊंगा और इसका परीक्षण करूँगा और उसी परिणाम को प्राप्त कर वापस पोस्ट करूँगा। धन्यवाद।
ग्रेग

जवाबों:


399

मुझे उस लिंक को पढ़ने का हल मिला जो गैरी ने दिया था (और मैं इस तरीके का पालन करने का सुझाव देता हूं)।

एसवीएन क्लाइंट 1.6.x के साथ अपनी वर्किंग डायरेक्टरी को लागू करते हुए ट्री संघर्ष को हल करने के लिए सारांश : आप उपयोग कर सकते हैं:

svn resolve --accept working -R .

.संघर्ष में निर्देशिका कहां है।

चेतावनी : "अपनी वर्किंग डायरेक्टरी को कमिट करना" का मतलब है कि आपका सैंडबॉक्स स्ट्रक्चर वही होगा जो आप कर रहे हैं, इसलिए यदि, उदाहरण के लिए, आपने अपने सैंडबॉक्स से कुछ फाइल डिलीट कर दी हैं तो वे रिपॉजिटरी से भी डिलीट हो जाएंगे। यह केवल विवादित निर्देशिका पर लागू होता है।

इस तरह, हम एसवीएन को --resolveआपके सैंडबॉक्स ( --accept working), पुनरावृत्ति ( -R), वर्तमान निर्देशिका ( .) से शुरू करने के लिए, संघर्ष को हल करने के लिए ( ) को सुलझाने की सलाह दे रहे हैं ।

TortoiseSVN में, राइट क्लिक पर "हल" का चयन करते हुए, वास्तव में इस मुद्दे को हल करता है।


32
इस तरह आप संघर्ष (--resolve) को हल करने के लिए svn को सुझाव दे रहे हैं, अपने सैंडबॉक्स (--accept working) के अंदर काम की प्रतिलिपि को स्वीकार करते हुए, पुनरावर्ती (-R), वर्तमान निर्देशिका (।) HTH
Gicappa

22
TortoiseSvn में, राइट क्लिक पर "हल" का चयन करते हुए, वास्तव में इस मुद्दे को हल करता है।
समझें

40
क्या यह आंख मूंद कर काम की कॉपी को स्वीकार नहीं करता है? मेरा मतलब है कि मुझे ऐसा लग रहा है कि मैं यह नहीं बता सकता कि इन संघर्षों के साथ मुद्दे कहां मौजूद हैं, लेकिन अगर मैं सिर्फ काम करना चाहता हूं और स्वीकार करता हूं तो क्या यह अन्य लोगों के काम को नहीं मिटाएगा?
पैरिस

10
ऐसा होने का एक कारण यह हो सकता है कि आप svn rm'dएक निर्देशिका जिसे आपने सोचा था कि अब उसकी आवश्यकता नहीं थी, लेकिन किसी और ने एक नई फ़ाइल जोड़ी जो आवश्यक है। जब आप अपनी कार्यशील प्रति अपडेट करते हैं तो आपको एक पेड़ संघर्ष प्राप्त करना चाहिए। यदि आप अपने समाधान को केवल आँख बंद करके स्वीकार करते हैं (निर्देशिका को हटाते हुए) तो आप उस व्यक्ति की फ़ाइल को हटा देंगे। कोई जादू नहीं है "सही काम करें" बटन। आपको यह समझना होगा कि यह आप क्या कर रहे हैं, क्यों नवीनतम संस्करण के साथ विवादित है, और इसे ठीक से कैसे हल करें।
बमबम

5
@TWiStErRob, मैं तर्क देता हूं कि यह लक्षण एसवीएन में एक संस्करण नियंत्रण उपकरण के रूप में निहित मुद्दों का संकेत है। निजी तौर पर, भविष्य में इस मुद्दे को 'टालने' का तरीका इस्तेमाल करना होगा git। चूंकि यह सबसे अधिक संभावना है कि पूछने वाले के लिए एक व्यावहारिक विकल्प नहीं है, तो स्थिति से निपटना क्योंकि यह उत्तर बताता है कि सबसे अच्छा विकल्प है।
जेस टेल्फोर्ड

59

उपखंड 1.6 ने निर्देशिका स्तर पर संघर्षों को कवर करने के लिए ट्री कन्फ्लिक्ट्स को जोड़ा। एक अच्छा उदाहरण यह होगा कि जब आप किसी फ़ाइल को स्थानीय रूप से हटाते हैं तो एक अपडेट उस फ़ाइल पर एक पाठ परिवर्तन लाने की कोशिश करता है। एक और जब आपके पास एक फ़ाइल का एक तोड़फोड़ का नाम है जिसे आप संपादित कर रहे हैं जो कि एक ऐड / डिलीट एक्शन है।

CollabNet की तोड़फोड़ ब्लॉग ट्री कन्फ्लिक्ट्स पर एक शानदार लेख है ।


9
इनमें से एक भी उदाहरण आप मेरी स्थिति से संबंधित नहीं हैं। शायद मेरा वर्णन स्पष्ट नहीं है?
ग्रेग

33

मेरे अनुभव में, एसवीएन एक पेड़ संघर्ष बनाता है जब भी मैं एक फ़ोल्डर हटाता हूं। कोई कारण नहीं प्रतीत होता है।

मैं अपने कोड पर केवल एक ही काम कर रहा हूं -> एक निर्देशिका हटाएं -> प्रतिबद्ध -> संघर्ष!

मैं Git में जाने का इंतजार नहीं कर सकता ।

मुझे स्पष्ट करना चाहिए - मैं उप ग्रहण का उपयोग करता हूं । शायद यही समस्या है! फिर से, मैं स्विच करने के लिए इंतजार नहीं कर सकता ...


2
SVN कमांड-लाइन क्लाइंट से समान समस्या है, इसलिए यह ग्रहण नहीं है।
dolmen

3
मुझे NetBeans और SVN के साथ भी यही समस्या है। निर्देशिका हटाएं -> संघर्ष।
ग्रुबर

2
यहाँ भी यही समस्या है ... बहुत परेशान करने वाला ... REVERT, अपडेट, डिलीट और कमिट करना है ...
marcolopes

1
जब मुझे पेड़ से टकराव मिला तो मैंने इंटेलीज आइडिया के साथ एक शानदार ट्रिक खोजी। मैं अपने सभी परिवर्तनों को शेल्फ करता हूं (यह मेरे परिवर्तनों का एक पैच बनाने और फिर उन्हें वापस रोल करने के समान है)। तब मैं तोड़फोड़ से नवीनतम परिवर्तन प्राप्त करने के लिए एक svn अद्यतन करता हूं। उसके बाद मैंने अपने परिवर्तनों को अन-शेल्फ किया (उसी तरह पैच लागू करना) और वायोला!
एहरहार्ट

1
मुझे लगता है कि एक ही समस्या है Ubuntu 12.04.4 LTS पर असेंबला रेपो के खिलाफ svn क्लाइंट 1.7.9 का उपयोग करना।
सिलिकॉनक्रॉस्ट

28

मुझे नहीं पता कि यह आपके साथ हो रहा है, लेकिन कभी-कभी मैं विलय करने के लिए गलत निर्देशिका चुनता हूं और मुझे यह त्रुटि मिलती है, हालांकि सभी फाइलें पूरी तरह से ठीक हैं।

उदाहरण:

मर्ज / svn / परियोजना / शाखाओं / कुछ-शाखा / स्रोतों से / svn / परियोजना / ट्रंक ---> पेड़ संघर्ष

मर्ज / svn / परियोजना / शाखाओं / कुछ-शाखा को / svn / परियोजना / ट्रंक ---> ठीक है

यह एक मूर्खतापूर्ण गलती हो सकती है, लेकिन यह हमेशा स्पष्ट नहीं होता है क्योंकि आपको लगता है कि यह कुछ अधिक जटिल है।


17

यहां जो हो रहा है वह निम्न है: आप अपनी ट्रंक पर एक नई फ़ाइल बनाते हैं, फिर आप इसे अपनी शाखा में मर्ज करते हैं। मर्ज कमिट में यह फाइल आपकी शाखा में भी बनाई जाएगी।

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

इससे बचने का तरीका, एक विशेष मर्ज, एक पुनर्निवेश है । आप इसे --reintegrateस्विच से हासिल कर सकते हैं ।

आप इसके बारे में प्रलेखन में पढ़ सकते हैं: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reztetegrate

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

एक शाखा को फिर से स्थापित करने के बाद इसे हटाने के लिए अत्यधिक सलाह दी जाती है, अन्यथा जब भी आप दूसरी दिशा में विलय करते हैं: आप ट्रेंक से अपनी शाखा में विलीन हो रहे हैं। (ठीक उसी कारण के लिए जैसा कि पहले वर्णित है।)

इसके आसपास भी एक रास्ता है, लेकिन मैंने कभी कोशिश नहीं की। आप इसे इस पोस्ट में पढ़ सकते हैं: v1.6 में तोड़फोड़ शाखा पुनर्निवेश


1
डाउनवोट --reintegrateकिया गया क्योंकि विकल्प को तोड़फोड़ 1.8 में चित्रित किया गया है। SVN 1.8 के साथ इस तरह के मर्ज स्वचालित हैं!
पहर

8
अपवित्र क्योंकि बहुत से लोग अभी भी तोड़फोड़ का उपयोग करते हैं <1.8
जुलका 20

मुझे लगता है कि उत्तर में SVN संस्करण जानकारी जोड़ना क्रम में होगा।
पीटर मोर्टेंसन

1
1.8 यहाँ और यह इस समाधान के बिना काम नहीं करेगा।
शीतकालीन

Upvoted क्योंकि यह प्रश्न का उत्तर देता है कि ऐसा क्यों होता है।
जोशुआ ब्रीडेन

7

यह एक ही संस्करण क्लाइंट का उपयोग न करने के कारण हो सकता है।

वर्जन 1.5 क्लाइंट और वर्जन रिपॉजिटरी की ओर 1.6 वर्जन का उपयोग करने से इस तरह की समस्या पैदा हो सकती है। (मैं सिर्फ अपने आप को काट रहा था।)


4

यदि आप पेड़ से टकराव का सामना करते हैं, तो इसका मतलब यह नहीं है कि आप फ़ाइल के पास कहीं भी संपादित / हटा नहीं पाए / हैं, एक अच्छा मौका यह भी है कि मर्ज कमांड में कोई त्रुटि थी।

क्या हो सकता है कि आप पहले से ही अपने वर्तमान मर्ज में शामिल किए गए परिवर्तनों का एक समूह पहले ही विलय कर चुके हैं। उदाहरण के लिए, ट्रंक में किसी ने एक फ़ाइल को संपादित किया, और फिर बाद में उसका नाम बदल दिया। यदि आपके पहले मर्ज में आप एडिट को शामिल करते हैं, और फिर एक दूसरे मर्ज में एडिट और रीनेम (अनिवार्य रूप से रिमूव) दोनों को शामिल करते हैं, तो यह आपको एक पेड़ संघर्ष भी देगा। इसका कारण यह है कि पहले मर्ज किया गया संपादन तब आपके स्वयं के रूप में प्रकट होता है, और इस प्रकार यह निष्कासन स्वचालित रूप से नहीं किया जाएगा।

यह कम से कम 1.4 रिपॉजिटरी पर हो सकता है, मुझे यकीन नहीं है कि 1.5 में पेश किया गया मर्जट्रैकिंग यहां मदद करता है।


2

आज से कम से कम 3 महीने पहले तक, मुझे नियमित रूप से सैकड़ों पेड़ संघर्षों का सामना करना पड़ा था जब एक शाखा को ट्रंक में वापस लाने का प्रयास किया गया था ( टोर्टोइस्स वीएन 1.11 का उपयोग करके )। रिबेट हुआ या नहीं, बीटीडब्लू। मैं अपने v1 के बाद से TortoiseSVN का उपयोग कर रहा हूं, 2004 में वापस, और मैं हर समय शाखाओं को फिर से संगठित करने के लिए उपयोग करता था। मुझे लगता है कि हाल ही में कुछ हुआ होगा?

इसलिए आज मैंने इस सरल प्रयोग को चलाया, और मैंने पाया कि इन पागल संघर्षों को क्या बनाया जा रहा है:

  1. मैंने ट्रंक @ 393 बंद कर दिया;
  2. मैंने दसियों फ़ाइलों को बेतरतीब ढंग से संशोधित किया, साथ ही नए भी बनाए;
  3. मैंने वचन दिया। अब @ 395 (एक सहकर्मी 394 पर अपना सामान लेने के लिए रवाना हो गया)।
  4. फिर मैंने शाखा को ट्रंक में वापस लाने का प्रयास किया, केवल परीक्षण; विज़ार्ड में TortoiseSVN की सिफारिश के बाद: "सभी संशोधनों (पुनर्निवेश) को मर्ज करने के लिए, उस बॉक्स को खाली छोड़ दें"। इसे प्राप्त करने के लिए, मैंने ट्रंक फ़ोल्डर पर राइट-क्लिक किया, और "TortoiseSVN> मर्ज, को / पथ / से / शाखा" के लिए चुना, और मैंने डायल पर सलाह के अनुसार, रेव रेंज को खाली छोड़ दिया

चर्चा: (लगाव देखें)

सभी संशोधन ... क्या? थोड़ा मुझे पता था कि ग्राहक " लक्ष्य के सभी संशोधनों " (ट्रंक) का जिक्र कर रहा होगा , जैसा कि, उस शाखा को फिर से स्थापित करने की प्रक्रिया में, मैंने "मर्जिंग रिविजन 1-HEAD" का उल्लेख देखा! हे भगवान। गरीब शैतान, तुम यहाँ अपनी मौत के लिए गिर रहे हो। उस शाखा का जन्म @ 393 था, क्या आप इसका जन्म प्रमाण पत्र नहीं पढ़ सकते, भगवान के लिए?यही कारण है कि इतने संघर्ष हुए: SVN-cli संशोधन 1 से एक मूर्खतापूर्ण होड़ पर जा रहा है

संकल्प:

  1. इसके विपरीत, जो सलाह दी जाती है, एक सीमा निर्दिष्ट करें, जो शाखा के जीवन के सभी संशोधनों को शामिल करती है! इसलिए, 394-हेड ;
  2. अब उस मर्ज परीक्षण को फिर से चलाएं, और सिगार प्राप्त करें। ( दूसरा लगाव देखें)।

Moral: मैं समझ नहीं सकता कि उन्होंने अभी भी उस बग को ठीक क्यों नहीं किया है, क्योंकि यह एक है, मुझे क्षमा करें। मुझे उनके साथ रिपोर्ट करने के लिए समय लेना चाहिए।


1

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

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


1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। केवल एक चीज जो वास्तव में मेरे लिए काम करती थी वह थी विवादित उपनिर्देशिकाओं को हटाना:

svn delete --force ./SUB_DIR_NAME

फिर उन्हें काम करने वाली कॉपी में एक और रूट डायरेक्टरी से फिर से कॉपी करें:

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

फिर करो

svn cleanup

तथा

svn add *

आपको पिछले एक के साथ चेतावनी मिल सकती है, लेकिन बस उन्हें अनदेखा करें और अंत में

svn ci .

0

मुझे भी यही समस्या थी, और इन निर्देशों का उपयोग करके मर्ज को फिर से करके इसे हल किया । मूल रूप से, यह अपडेट करने के लिए SVN के "2-URL मर्ज" का उपयोग करता हैtrunk इतिहास और वृक्ष संघर्षों के बारे में इतना परेशान किए बिना, अपनी शाखा की वर्तमान स्थिति करने के लिए । 114 पेड़ संघर्षों को मैन्युअल रूप से ठीक करने से मुझे बचाया।

मुझे यकीन नहीं है कि अगर यह इतिहास के साथ-साथ एक को भी संरक्षित करेगा, लेकिन यह मेरे मामले में इसके लायक था।


5
इतिहास यह है कि हम वीसीएस का उपयोग क्यों करते हैं ... या मैं कुछ याद कर रहा हूं?
ट्विस्टस्ट्रीम

0

एक परिदृश्य जो मैं कभी-कभी में चलाता हूं:

मान लें कि आपके पास एक ट्रंक है, जिससे आपने एक रिलीज शाखा बनाई। ट्रंक पर कुछ परिवर्तनों के बाद (विशेष रूप से "कुछ-डीआर" निर्देशिका बनाने) में, आप एक सुविधा / फ़िक्स शाखा बनाते हैं जिसे आप बाद में रिलीज़ शाखा में भी मर्ज करना चाहते हैं (क्योंकि परिवर्तन काफी छोटे थे और रिलीज़ के लिए फ़ीचर / फ़िक्स महत्वपूर्ण है) ।

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

यदि आप इसके बाद फीचर / फिक्स ब्रांच को सीधे रिलीज़ ब्रांच में मर्ज करने की कोशिश करते हैं, तो आपको एक पेड़ संघर्ष मिलेगा (भले ही डायरेक्टरी फीचर / फिक्स ब्रांच में मौजूद नहीं थी):

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

इसलिए आपको सुविधा / फिक्स शाखा बनाने से पहले ट्रंक पर स्पष्ट रूप से विलय करने की आवश्यकता है, जिसने सुविधा / फिक्स शाखा को मर्ज करने से पहले "कुछ-डीआईआर" निर्देशिका बनाई थी।

मैं अक्सर यह भूल जाता हूं कि चूंकि यह आवश्यक नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.