नोट: मेरा प्रश्न मेरी विशिष्ट समस्या (जिसमें लाइफ़रे शामिल है) में केंद्रित है, लेकिन मुझे आशा है कि यह किसी के लिए भी उपयोगी हो सकता है जिसे एक ही परियोजना के विभिन्न संस्करणों को बनाए रखने की आवश्यकता है।
मैं एक कंपनी पर काम करता हूं, जो लाइफ़रे पोर्टल के लिए बहुत सारे प्लगइन्स लिखती है । ये प्लगइन्स (पोर्टल्स, थीम आदि) आमतौर पर पुन: प्रयोज्य हैं और निश्चित रूप से, पोर्टल के नए संस्करणों के लिए अपडेट किए जाने चाहिए।
हालाँकि, हमारा माइग्रेट होना सामान्य है, हम कहते हैं, लाइफ़रे के नए संस्करण के लिए एक पोर्टलेट और इसके पिछले संस्करण को बनाए रखने के लिए। इसके अलावा, अक्सर हमें कुछ ग्राहकों के लिए बहुत विशिष्ट अनुकूलन बनाने होते हैं, जो "मुख्य संस्करण" में जोड़ने का कोई मतलब नहीं है।
ये आवश्यकताएं हमारे काम को जटिल बनाती हैं लेकिन, सौभाग्य से, हम कुछ सरलीकरण मान सकते हैं। उदाहरण के लिए, प्लगइन्स अक्सर एक समय में केवल एक प्रोग्रामर द्वारा अपडेट किए जाते हैं। एक ही समय में एक प्लगइन में दो या दो से अधिक सुविधाओं का होना बहुत दुर्लभ है।
अब, हम Gitorious की ओर पलायन कर रहे हैं । हम ऐसे परिदृश्य के लिए एक शाखा मॉडल की कल्पना करने की कोशिश कर रहे हैं।
मेरा मॉडल
मैंने जो प्रस्तावित किया वह था:
- प्रत्येक प्लगइन में एक परियोजना के अंदर Gitorious में अपना स्वयं का भंडार होगा। उदाहरण के लिए, बिल्ली के बच्चे को प्रदर्शित करने के लिए एक पोर्टल परियोजना के
kittens-portletअंदर एक भंडार होगाliferay-portlets। - एक नया प्लगइन बनाते समय, इसे लाइफ़रे संस्करण (उदाहरण के लिए
lf5.2) के अनुसार नामित शाखा में बनाएँ । - हर बार एक अपडेट प्लगइन पर किया जाता है, अपडेट को मंजूरी दी जाती है और उत्पादन में तैनात किया जाता है, प्लगइन को एक संस्करण के लिए टैग करता है (उदाहरण के लिए
lf5.2v1,lf5.2v2आदि।) *। - हर बार एक प्लगइन को लाइफ़रे के नए संस्करण में पोर्ट किया जाना चाहिए, हम सबसे हालिया संस्करण (उदाहरण के लिए, शाखा
lf6.0) को शाखा देते हैं । - एक बार उत्पादन में, नई शाखा के प्रमुख को एक टैग प्राप्त होगा जैसे
lf6.0v1। - जब भी हमें किसी क्लाइंट-विशिष्ट तरीके से किसी प्लगइन को कस्टमाइज़ करना होता है, तो हम क्लाइंट के नाम के साथ एक शाखा बनाते हैं (उदाहरण के लिए, हम
lf5.2clientcorpअपने क्लाइंट "ClientCorp Inc." के लिए एक शाखा बनाएंगे)
यह एक असामान्य मॉडल है: इसकी कोई masterऔर नहीं बहुत-से-विलय वाली शाखाएँ होंगी । यह है कि मुझे लगता है कि इस तरह के मॉडल के साथ एक भंडार होगा:

एक मित्र ने इस प्रणाली को जटिल और त्रुटि-प्रवण पाया। उन्होंने उत्कृष्ट और लोकप्रिय विंसेंट ड्रिस्सेन मॉडल का सुझाव दिया , जिसे मैंने अभी भी प्रबंधन और अनुशासन-मांग के लिए कठिन पाया। यह बहुत अच्छा है (और परीक्षण!), लेकिन हमारी स्थिति के लिए बहुत जटिल लगता है।
मेरे दोस्त का मॉडल
तब उन्होंने एक और मॉडल का सुझाव दिया: हम लाइफ़रे संस्करण में प्रत्येक प्लगइन के लिए एक रिपॉजिटरी रखेंगे (इसलिए हम एक kittens-lf5.2-portletऔर फिर एक बनाना शुरू करेंगे kittens-lf6.0-portlet), प्रत्येक एक masterशाखा और एक developशाखा के साथ। masterहमेशा तैनाती के लिए तैयार हो जाएगा। (या यह दूसरा रास्ता हो सकता है, masterऔर stable, स्टीव लोश द्वारा सुझाए गए अनुसार )।
यह बहुत सरल है, लेकिन मुझे यह प्रणाली पसंद नहीं है:
- इसके परिणामस्वरूप एक परियोजना में बहुत सारे भंडार हो सकते हैं, जिससे गॉइटियस को ब्राउज़ करना मुश्किल हो जाता है।
- परियोजना की निर्देशिका का नाम प्रासंगिक है। यदि कोई रिपॉजिटरी को
kittens-lf6.0-portletडायर पर क्लोन करता है और चींटी (हमेशा की तरह) के साथ डब्ल्यूएआर उत्पन्न करता है, तो डब्ल्यूएआर नाम भी होगाkittens-lf6.0-portlet। इसkittens-portletपोर्टल के पुराने संस्करणों ( उदाहरण के लिए नामित ) को एक उन्नत पोर्टल में अलग (और शायद लापता) पोर्टलेट के रूप में माना जाएगा। जरा सी देखभाल इससे बच सकती है लेकिन मैं इससे बचना पसंद करूंगा। - एक ही प्लगइन के विभिन्न संस्करणों को अलग रखा जाएगा। मैं अपना दिल तोड़ता हूँ :(
kittens-lf6.0-portletमुझे लगता है कि एक भंडार के लिए एक बदसूरत नाम है।
मुझे दो अंतिम बिंदुओं पर संदेह है - जो दो और व्यक्तिपरक हैं, भी - मेरी अनिच्छा का मुख्य कारण हैं। बहरहाल, सभी चार आपत्तियां खड़ी हैं।
OTOH, मेरा अपना प्रस्ताव खुद को अजीब लगता है और मुझे आश्चर्य होता है कि क्या इस पर कोई छिपी हुई बगिया है। OT3rdH git इतना शक्तिशाली और लचीला है कि मुझे लगता है कि मुझे इसकी संभावनाओं को तलाशने में कोई शर्म नहीं होनी चाहिए।
इसलिए मैं पूछता हूँ:
- सबसे अच्छा मॉडल क्या होगा? मेरा प्रस्ताब? मेरे दोस्त का मॉडल? अब पारंपरिक विन्सेन्ट Driessen प्रणाली?
- आप किस अन्य ब्रांचिंग मॉडल का सुझाव देंगे?
- अगर आपको लगता है कि मेरा मॉडल खराब है, तो आप ऐसा क्यों सोचते हैं? मैं यह जानना पसंद करूंगा कि कमियां और अंधे धब्बे क्या हैं।
* दरअसल, मैं कमिटमेंट को एक संस्करण के साथ टैग करना पसंद करूंगा, v1लेकिन जाहिरा तौर पर git में एक टैग को शाखा में बंद नहीं किया गया है - अर्थात, मैं 1 v1टैग नहीं कर सकता था lf5.2और दूसरे में lf6.0- तो मुझे नाम देना होगा डाली। क्या यह बीटीडब्ल्यू सही है?