2012-03-27 15 views
12

कभी-कभी मुझे लगता है कि मुझे एक फाइल मिली है जो समय के साथ अधिक कक्षाओं/कार्यों/व्हाट्सवर्स को पसंद करने के लिए उगाई गई है। यह रिफैक्टर करने का समय है! मुझे आमतौर पर इस मामले में पता चलता है कि मेरी एक फ़ाइल कई हो जाती है: स्वयं और कई अन्य फाइलें, जिनमें प्रत्येक फ़ाइल के अलग-अलग सेगमेंट होते हैं।क्या कोड ब्लॉक के आंदोलन को ट्रैक करने के लिए Mercurial की नामकरण कार्यक्षमता "दुरुपयोग" करना ठीक है?

दुर्भाग्य से, इन नई फ़ाइलों को "ब्रेक" इतिहास थोड़ा सा बनाना - यह कहना मुश्किल है कि उन कार्यों को मूल रूप से दूसरी फ़ाइल से आया था। रिफैक्टरिंग के दौरान कोड में किए गए कोई अन्य बदलाव होने पर यह और भी बदतर है।

मेरे एक सहकर्मी ने पाया है कि वह "गाली" हो सकता है कुछ इस तरह कर रही द्वारा नाम बदलने कार्यक्षमता:

hg rename --after original_file new_file_1 
hg rename --after original_file new_file_2 
hg rename --after original_file new_file_3 
hg add original_file 

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

क्या इस "एकाधिक नाम" दृष्टिकोण के साथ कुछ गलत है?

उत्तर

9

आपको यह सुनिश्चित करने से पहले know what hg copy really means सुनिश्चित करना चाहिए।

संक्षेप में, new_file_1 को original_file से एक फ़ाइल को कॉपी विलीन हो जाती है यदि और केवल यदि यह आम पूर्वज में new_file_1 नहीं मिल सकता है एक कड़ी है कि मर्क्युरियल भविष्य में उपयोग करेगा कहते हैं। यह प्रतिलिपि बनाने के बाद आम तौर पर केवल पहले विलय में मामला होगा।

एक ग्राफ उदाहरण देकर स्पष्ट करना हो सकता है यह बेहतर:

old --- edit old --- edit in old copied to new --- edit old --- merge 
    \    /       /
    copy old new --/------- edit new ------------/ 

हम एक changeset जहां आप फ़ाइल old है के साथ शुरू करते हैं। फिर आप एक शाखा में old संपादित करें और oldnew पर दूसरे में कॉपी करें। पहले मर्ज में old पर संपादन new में कॉपी किया गया है। दूसरे विलय में new के लिए कोई विशेष उपचार नहीं है क्योंकि new सामान्य पूर्वजों (copy old new परिवर्तन) में पाया जाता है।

आपके मामले के लिए इसका क्या अर्थ है कि भविष्य में विलय में एक बड़ा अंतर होता है जब लोग copy old new देखते हैं। यदि आप

old --- copy old new 

अपने प्रारंभिक बिंदु के रूप में उपयोग करने के लिए सभी को प्राप्त कर सकते हैं, तो चीजें ठीक हैं। लेकिन अगर किसी के पास old परिवर्तन से शाखाएं बंद हैं और वास्तव में उस शाखा में old संपादित की गई हैं, तो वे copy old new परिवर्तन के साथ विलय करने का प्रयास करते समय विवाद विवाद प्राप्त करेंगे।

अधिक सटीक रूप से, वे old फ़ाइल के किसी भी हिस्से को संपादित करते हुए विलय विवाद प्राप्त करते हैं जिन्हें new फ़ाइल में कॉपी नहीं किया गया था।मर्ज टकराव आपको इस तथ्य से सतर्क करते हैं कि old में कोई बदलाव आया था जिसे new में कॉपी करने की आवश्यकता है। हालांकि, जब आपने वास्तव में

hg copy old new1 
hg copy old new2 
hg copy old new3 

तो आपको तीन नई फ़ाइलों में से दो में अप्रासंगिक विलय विवाद मिलेगा।

तुम सिर्फ नष्ट कर दिया था old फ़ाइल और तीन नई फ़ाइलें जोड़ा है, तो आप अभी भी एक मर्ज संघर्ष यहाँ मिलेगा: आप

remove changed old which local deleted 
use (c)hanged version or leave (d)eleted? 

पूछा जाएगा कि आप कि संकेत दिखाई या देखना पसंद करते हैं या नहीं मर्ज टूल स्टार्ट अप आपके ऊपर है - लेकिन अब आप hg copy (या hg rename --after) के परिणामों को जानते हैं, यह वास्तव में वही बात है)।

+0

बहुत बढ़िया! विस्तृत उत्तर के लिए धन्यवाद! –

8

आसान है कि के लिए hg copy उपयोग करने के लिए है:

hg copy original_file new_file_1 
hg copy original_file new_file_2 
hg copy original_file new_file_3 

अब सभी 3 मूल इतिहास है। लेकिन, हाँ, किसी भी तरह से यह पूरी तरह से ठीक है और आमतौर पर किया जाता है।