version control Mercurial: एकाधिक रिपोजिटरी बनाम शाखाओं नामित




version-control branch (5)

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

हम वर्तमान में अपेक्षाकृत बड़े कोडबेस पर उपversण का उपयोग कर रहे हैं। प्रत्येक रिलीज को अपनी शाखा मिलती है, और ट्रंक के खिलाफ फिक्स का प्रदर्शन किया जाता है और svnmerge.py का उपयोग करके रिलीज शाखाओं में माइग्रेट किया जाता है

मेरा मानना ​​है कि समय बेहतर स्रोत नियंत्रण में आगे बढ़ने आया है, और मैं थोड़ी देर के लिए Mercurial के साथ टकरा रहा हूँ।

हालांकि Mercurial का उपयोग कर ऐसी रिलीज संरचना के प्रबंधन के दो स्कूल होने लगते हैं। या तो प्रत्येक रिलीज को अपना खुद का रेपो मिल जाता है, और रिलीज शाखा के खिलाफ फिक्स किए जाते हैं और मुख्य शाखा (और किसी अन्य नई रिलीज शाखाओं) में धकेल जाते हैं। या एक ही भंडार (या एकाधिक मिलान प्रतियों) में नामित शाखाओं का उपयोग करते हैं।

किसी भी मामले में ऐसा लगता है कि मैं रिलीज शाखाओं में शामिल करने के लिए चेरीपिक परिवर्तनों में प्रत्यारोपण जैसे कुछ का उपयोग कर रहा हूं।

मैं आपसे पूछता हूं; प्रत्येक दृष्टिकोण की सापेक्ष योग्यता क्या हैं?


सबसे बड़ा अंतर यह है कि इतिहास में शाखा के नाम कैसे दर्ज किए जाते हैं। नामित शाखाओं के साथ शाखा का नाम प्रत्येक परिवर्तन में एम्बेडेड होता है और इस प्रकार इतिहास का एक अपरिवर्तनीय हिस्सा बन जाएगा। क्लोन के साथ कोई स्थायी रिकॉर्ड नहीं होगा जहां से एक विशेष परिवर्तन आया था।

इसका मतलब यह है कि क्लोन त्वरित प्रयोगों के लिए बहुत अच्छे हैं जहां आप शाखा का नाम रिकॉर्ड नहीं करना चाहते हैं, और नामित शाखाएं दीर्घकालिक शाखाओं ("1.x", "2.x" और इसी तरह के लिए अच्छी हैं)।

ध्यान दें कि एक एकल भंडार Mercurial में कई हल्के वजन वाली शाखाओं को आसानी से समायोजित कर सकता है। ऐसी इन-रिपोजिटरी शाखाओं को बुकमार्क किया जा सकता है ताकि आप आसानी से उन्हें फिर से ढूंढ सकें। आइए मान लें कि आपने कंपनी की रिपोजिटरी को क्लोन किया है जब ऐसा लगता है:

[a] --- [b]

आप दूर है और [x] और [y] बनाते हैं:

[a] --- [b] --- [x] --- [y]

मतलब है कि कोई [c] और [d] को भंडार में रखता है, इसलिए जब आप खींचते हैं तो आपको इस तरह का इतिहास ग्राफ मिलता है:

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d]

यहां एक ही भंडार में दो सिर हैं। आपकी कामकाजी प्रति हमेशा एक एकल बदलाव, तथाकथित काम करने वाली प्रतिलिपि अभिभावक परिवर्तन को प्रतिबिंबित करेगी। इसके साथ जांचें:

% hg parents

मान लें कि यह रिपोर्ट [y] । आप के साथ सिर देख सकते हैं

% hg heads

और यह रिपोर्ट करेगा [y] और [d] । यदि आप अपने भंडार को [d] क्लीन चेकआउट में अपडेट करना चाहते हैं, तो बस [d] के लिए संशोधन संख्या के साथ विकल्प [d] करें:

% hg update --clean [d]

फिर आप देखेंगे कि hg parents रिपोर्ट [d] । इसका मतलब है कि आपकी अगली प्रतिबद्धता [d] माता-पिता के रूप में होगी। इस प्रकार आप मुख्य शाखा में देखी गई एक बग को ठीक कर सकते हैं और परिवर्तन बना सकते हैं [e] :

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d] --- [e]

परिवर्तन [e] केवल पुश करने के लिए, आपको करने की आवश्यकता है

% hg push -r [e]

जहां [e] परिवर्तन हैश है। डिफ़ॉल्ट रूप से hg push बस रिपॉजिटरीज़ की तुलना करेगा और देखें कि [x] , [y] , और [e] गायब हैं, लेकिन हो सकता है कि आप अभी तक [x] और [y] साझा नहीं करना चाहें।

अगर बगफिक्स आपको भी प्रभावित करता है, तो आप इसे अपनी फीचर शाखा के साथ मर्ज करना चाहते हैं:

% hg update [y]
% hg merge

यह आपके रिपोजिटरी ग्राफ को इस तरह दिखने देगा:

            [x] --- [y] ----------- [z]
           /                       /
[a] --- [b] --- [c] --- [d] --- [e]

जहां [z] [y] और [e] बीच विलय है। आप शाखा को फेंकने का विकल्प भी चुन सकते थे:

% hg strip [x]

इस कहानी का मेरा मुख्य बिंदु यह है: एक क्लोन आसानी से विकास के कई ट्रैकों का प्रतिनिधित्व कर सकता है। यह किसी भी एक्सटेंशन का उपयोग किये बिना हमेशा "सादा एचजी" के लिए सच रहा है। हालांकि, बुकमार्क एक्सटेंशन एक बड़ी मदद है। यह आपको परिवर्तनों के लिए नाम (बुकमार्क) असाइन करने की अनुमति देगा। उपर्युक्त मामले में आप अपने विकास के सिर पर एक बुकमार्क और अपस्ट्रीम हेड पर एक बुकमार्क चाहते हैं। बुकमार्क को मर्कुरियल 1.6 के साथ धक्का दिया जा सकता है और खींचा जा सकता है और Mercurial 1.8 में अंतर्निहित सुविधा बन गया है।

यदि आपने दो क्लोन बनाने का विकल्प चुना है, तो [x] और [y] बनाने के बाद आपका विकास क्लोन ऐसा दिखाई देगा:

[a] --- [b] --- [x] --- [y]

और आपके अपस्ट्रीम क्लोन में निम्न शामिल होंगे:

[a] --- [b] --- [c] --- [d]

अब आप बग देखते हैं और इसे ठीक करते हैं। अपस्ट्रीम क्लोन उपयोग करने के लिए तैयार होने के बाद यहां आपको hg update करने की आवश्यकता नहीं है। आप प्रतिबद्ध और बनाते हैं [e] :

[a] --- [b] --- [c] --- [d] --- [e]

अपने विकास क्लोन में बगफिक्स को शामिल करने के लिए आप इसे वहां खींचें:

[a] --- [b] --- [x] --- [y]
           \
            [c] --- [d] --- [e]

और विलय करें:

[a] --- [b] --- [x] --- [y] --- [z]
           \                   /
            [c] --- [d] --- [e]

ग्राफ अलग दिख सकता है, लेकिन इसकी एक ही संरचना है और अंतिम परिणाम वही है। क्लोन का उपयोग करके आपको थोड़ा कम मानसिक बहीखाता करना पड़ा।

नामित शाखाएं वास्तव में यहां तस्वीर में नहीं आईं क्योंकि वे काफी वैकल्पिक हैं। नामांकित शाखाओं का उपयोग करने के लिए स्विच करने से पहले कई वर्षों तक Mercurial खुद को दो क्लोन का उपयोग करके विकसित किया गया था। हम 'डिफ़ॉल्ट' शाखा के अलावा 'स्थिर' नामक एक शाखा बनाए रखते हैं और 'स्थिर' शाखा के आधार पर हमारी रिलीज करते हैं। अनुशंसित वर्कफ़्लो के विवरण के लिए विकी में मानक ब्रांचिंग पृष्ठ देखें।


मुझे लगता है कि आप एक इतिहास में पूरा इतिहास चाहते हैं। अल्पावधि रेपो से बाहर निकलना अल्पकालिक प्रयोगों के लिए है, रिलीज जैसी प्रमुख घटनाएं नहीं।

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


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


मैं वास्तव में संस्करणों के लिए नामित शाखाओं का उपयोग करने के खिलाफ सलाह देंगे। यह वास्तव में टैग के लिए क्या हैं। नामित शाखाएं एक stable शाखा की तरह लंबे समय तक चलने वाले मोड़ों के लिए हैं।

तो टैग का उपयोग क्यों न करें? एक मूल उदाहरण:

  • विकास एक शाखा पर होता है
  • जब भी एक रिलीज बनाया जाता है, तो आप इसे तदनुसार टैग करते हैं
  • विकास वहां से जारी है
  • यदि आपके पास किसी निश्चित रिलीज में ठीक करने के लिए कुछ बग हैं (या जो कुछ भी), तो आप बस इसके टैग पर अपडेट करें, अपने बदलाव करें और प्रतिबद्ध करें

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







dvcs