2012-03-02 13 views
5

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

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

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

1) Make a few more commits to default and then "promote" to UAT (merge default onto UAT) 
2) Make a bugfix on UAT and "backport" it to default (merge UAT onto default) 

# 1 चल रहा है और # 2 मैं सब कुछ बाहर छीन लिया है के बीच में इतना है कि दोनों परिदृश्यों उसी बिंदु से शुरू ।

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

यदि मैं कॉन्फ़िगरेशन परिवर्तनों को वापस करता हूं और विलय करता हूं, तो भविष्य में उसी दिशा में विलय ठीक से व्यवहार करता है, लेकिन जिस मिनट में मैं दूसरी दिशा में जाता हूं, विलय फिर से फाइलों में गलत कॉन्फ़िगरेशन डालता है।

मुझे क्या याद आ रही है?

उत्तर

5

मुझे विश्वास है कि समस्या this question में समस्या के समान है: विलय करने से आपको लगता है कि यह काम नहीं करता है। विलय केवल फाइल-स्टेटस की तुलना करने का एक प्रश्न है, यह एक शाखा से दूसरे में परिवर्तन लागू करने का मामला नहीं है।

आपका प्रारंभिक बिंदु इस तरह एक इतिहास है:

UAT:  ... x --- y --- z 
          \ 
default: ..... a --- b --- c 

जहां x और y UAT के लिए config सेटिंग्स होते हैं और b कोई config सेटिंग्स के साथ डमी मर्ज है। तो b में फ़ाइलें a में दिखाई देती हैं - वे डमी विलय कर रहे थे।

आप अब default कि आप UAT को बढ़ावा देना चाहते हैं पर एक नया बदलाव करते हैं, आप के साथ काम करेंगे: मर्ज

UAT:  ... x --- y 
        \ 
default: ..... a --- b --- c 

y और c के बीच है। यह एक अपमानजनक विलय है जहां आम पूर्वज y स्वयं है। इसका मतलब है कि b और c के बीच सभी परिवर्तन तीन-तरफा विलय में "जीत" पाएंगे। कैसे जिसे एक तीन तरह से मर्ज में विलय कर रहे हैं के लिए टेबल है:

ancestor local other -> merge 
old  old old  old (nobody changed the hunk) 
old  old new  new (they changed the hunk) 
old  new old  new (you changed the hunk) 
old  new new  new (hunk was cherry picked onto both branches) 
old  foo bar  <!> (conflict, both changed hunk but differently) 

ध्यान दें कि मर्ज परिणाम मर्ज की "दिशा" पर निर्भर नहीं करता: तालिका local और के संबंध में सममित है other कॉलम।यहां, ancestor और local दोनों y है, और otherc है। तो मेज हो जाता है:

ancestor local other -> merge 
old  old new  new (they changed the hunk) 

आप देख सकते हैं कि मर्ज परिणाम हमेशा new परिवर्तन यह है कि c में बनाया गया था शामिल हैं।

यह महत्वपूर्ण नहीं है कि विलय खराब हो गया। मान लें कि आपके पास यूएटी पर एक नई प्रतिबद्धता है और यह प्रतिबद्धता कॉन्फ़िगर स्ट्रिंग को स्पर्श नहीं करती है, तो जब आप विलय करते हैं तो आपको वही व्यवहार मिल जाएगा (किसी भी दिशा में, विलय सममित होते हैं)।

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

+0

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

+0

शायद आप यूएटी सेटिंग्स को प्रतिबद्ध कर सकते हैं (अपने रखरखाव के लिए इसे आसान बनाने के लिए) और फिर उन्हें स्थानीय रूप से संशोधित (लेकिन प्रतिबद्ध नहीं) कर सकते हैं? आपको विलय से पहले परिवर्तनों को ढंकने की आवश्यकता होगी और जब (एक्सटेंशन को बाहर निकालें] (https://bitbucket.org/aragost/exclude) थोड़ा सा मदद कर सकते हैं तो उन्हें बाहर करने के लिए '-X' का उपयोग करें)। –

+0

मूल रूप से वह इस समय क्या कर रहा है - जरूरी और शेल्फिंग आवश्यकतानुसार। दुर्भाग्य से यह निर्बाध नहीं है, और जैसे ही हम अधिक वातावरण (उदाहरण के लिए उत्पादन) जोड़ते हैं, तो उन्हें कई अलमारियों या एमक से निपटना पड़ता है, जो आदर्श नहीं है (जहां 'आदर्श' स्पष्ट रूप से अनुपयोगी वर्कफ़्लो है जो ऊपर वर्णित है :))। मुझे लगता है कि हम अब के लिए प्रत्यारोपण दृष्टिकोण का प्रयास करेंगे और देखेंगे कि यह कैसे जाता है ... –

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