2009-04-08 7 views
8

में टैग का उचित उपयोग मेरे सहकर्मियों और मुझे रिलीज/एससीएम सिस्टम में टैग के मूल्य और उपयोग पर बहस हो रही है। हम इस मुद्दे को हल करने में हमारी सहायता के लिए अपने विचारों को रखने के लिए स्टैक ओवरफ्लो समुदाय को देख रहे हैं।एससीएम

एक पक्ष का दावा है कि टैग रिलीज प्रबंधन के लिए एक मूल्यवान अतिरिक्त हैं। उनके उपयोग का एक उदाहरण: हम एक मेवेन रिलीज करते हैं, जो एक नया टैग बनाता है (इसे 1.0 कॉल करें) जो इस रिलीज के लिए कोड स्नैपशॉट है। यह टैग एक वास्तविक शाखा होना चाहिए। जब किसी बग को ठीक करने की आवश्यकता होती है तो हम टैग की एक प्रति नई शाखा में बना सकते हैं (इसे 1.1 कहते हैं)। बग फिक्स वहाँ जाते हैं। इन फिक्स को ट्रंक में वापस विलय किया जा सकता है ताकि मुख्य देव शाखा को बग फिक्स मिल जाए। अंत में, 1.1 जारी किया गया है और एक टैग 1.1 स्वचालित रूप से बनाया गया है। यह चक्र जारी है। टैग का मुख्य लाभ यह है कि यदि आपको किसी भी कारण से संस्करण 1.0 को फिर से रिलीज़ करने की आवश्यकता है, तो आप केवल विश्वास 1.0 के साथ टैग 1.0 जारी कर सकते हैं कि इसे कभी भी किसी के द्वारा बदला नहीं जा सकता है। साथ ही, "रिलीज टैग 1.0" कहने से क्लीनर है "शाखा 1.0 का रिलीज संशोधन 1 जो फिक्स के बिना मूल 1.0 है"।

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

स्पष्ट रूप से दोनों विधियां काम करना होगा। मैं समुदाय के विचारों को सुनना चाहता हूं कि किस विधि को प्राथमिकता दी जाती है और क्यों।

संपादित करें: मैं थोड़ा चिंतित हूं कि "सर्वश्रेष्ठ" तरीका अंतर्निहित एससीएम प्रणाली पर निर्भर करता है। या तो उत्तर के लिए सबवर्जन पर व्यवस्थित करें या यदि संभव हो तो इसे एससीएम अज्ञेयवादी रखें।

उत्तर

4

एक एससीएम अज्ञेय दृष्टिकोण से, टैग एक संशोधन से बहुत अलग है।

दोनों ही तरीके से लागू किया जा सकता है, दोनों एक "समय रेखा" का प्रतिनिधित्व करता है, लेकिन अपने लक्ष्य अलग है:

  • एक टैग एक अपरिवर्तनीय राज्य है जहां सभी फ़ाइलों में एक विशिष्ट आईडी द्वारा संदर्भित कर रहे हैं प्रतिनिधित्व करते हैं । यह एक नाम representing many things है लेकिन मुख्य रूप से एक स्थिर स्थिति है ...)
  • एक संशोधन एक प्रतिबद्ध लेनदेन का प्रतिनिधित्व करता है (not all SCM have those, विशेष रूप से पुराने 'फाइल-दर-फ़ाइल दृष्टिकोण' वाले पुराने)। सभी काम एक "स्थिर" स्थिति का प्रतिनिधित्व नहीं करते हैं (जैसे "संकलन" या "निष्पादित" में सफलतापूर्वक)। वे वैश्विक इतिहास का सिर्फ एक नया तत्व हैं।

एसवीएन के साथ समस्या यह है कि संशोधन, टैग और शाखाएं सभी लागू होती हैं।
लेकिन मैं अभी भी वह विकल्प पसंद करूंगा जहां एक टैग "read-only" branch के रूप में उपयोग किया जाता है।

4

मेरी राय टैग में उपयोगी हैं। इस परियोजना के जीवन में कुछ समय होगा कि आप एक बग या बदलाव में आते हैं और आप जानना चाहते हैं कि यह पिछली रिलीज में था या नहीं। निष्पादन और वास्तव में कोड के विकास में क्षमता को मापने के लिए एक रिलीज से दूसरे में कोड की तुलना करने के कारण होंगे।

निश्चित रूप से, एक मौका है कि आप इसे पेंच कर सकते हैं, लेकिन इसे हमेशा पूर्ववत किया जा सकता है। वास्तव में इसका कोई कारण नहीं है, और भविष्य में यह उपयोगी क्यों हो सकता है इसके कई कारण हैं। मेरे लिए यह एक ब्रेनर है।

मैं मानता हूं कि आपको शाखाओं का उपयोग करना और वहां अपना विकास करना चाहिए, लेकिन जब भी आप वास्तव में कुछ जारी करते हैं, तो इसका एक टैग बनाएं।

0

मुझे टैग के बारे में "संशोधन के लिए केवल एक फैंसी नाम" के रूप में सोचना पसंद है। मैंने हमेशा उनके बारे में सोचा है, और आईआईआरसी Mercurial में वे बस यही हैं। हालांकि, जैसा कि आप कहते हैं, वे वास्तव में ट्रंक/* टैग/फैंसी-नाम/

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

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

समस्या जो मैं दूसरी दृष्टिकोण के साथ देखता हूं वह है: यदि आप 1.0 को फिर से रिलीज़ करते हैं तो आप क्षेत्र में सॉफ़्टवेयर के बीच एक आसान अंतर कैसे बना रहे हैं? इसका मतलब है कि आपके पास 1.0 और दूसरा 1.0 वास्तव में एक अलग कोड बेस का जिक्र कर सकता है ...।

1

हां, आप टैग का उपयोग करना चाहते हैं।

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

यदि आप रिलीज पर शाखा बनाते हैं, तो आप हमेशा यह पता लगा सकते हैं कि उत्पादन में कौन सा संशोधन जारी किया गया था, लेकिन यह सिर्फ एक टैग को देखने की तुलना में दर्द का दर्द है। यदि आप रिलीज शाखाओं का उपयोग नहीं करते हैं तो यह ट्रैक खोना आसान होगा कि किसी विशेष निर्माण के लिए किस संशोधन का उपयोग किया गया था।

svn के साथ समस्या यह है कि यह टैग और शाखाओं के बीच भेद को धुंधला करता है। कोई भी हमेशा टैग पर प्रतिबद्ध हो सकता है, इसलिए इसे निश्चित/अपरिवर्तनीय होने की गारंटी नहीं है। पीवीसीएस जैसे अन्य वीसीएस में, एक "टैग" अपरिवर्तनीय है। आप टैग्स को टैग्स को रोकने से रोकने के लिए एक टीम सम्मेलन अपना सकते हैं, या यहां तक ​​कि शायद टैग्स को टैग को रोकने के लिए प्रतिबद्ध हुक का उपयोग भी कर सकते हैं।

0

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

मैं आपको नहीं बता सकता कि कोई मेरे पास कितनी बार आया है और कहा है "यह माइक्रोकंट्रोलर कोड काम नहीं कर रहा है, क्या आप मदद कर सकते हैं?" और मैं उनसे पूछता हूं, "आप किस संस्करण का उपयोग कर रहे हैं?" और वे कहते हैं, "मुझे यकीन नहीं है" क्योंकि वे अच्छे रिलीज प्रबंधन नहीं कर रहे हैं (कम से कम डिवाइस पर स्टिकर डालने पर, ईईपीरोम में वर्जनिंग जानकारी डालने के लिए बेहतर है जिसे रीयलटाइम में पूछताछ की जा सकती है)। > :(

0

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

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

0

मैं दोनों दृष्टिकोणों को जोड़ता हूं। जब भी आप एक रिलीज करते हैं, इसे टैग करें। टैग कभी नहीं बदलना चाहिए, इसलिए "1.0.0" टैग की उपस्थिति एक संकेतक है कि आपको 1.0.0 के रूप में कुछ भी जारी करने की कोशिश नहीं करनी चाहिए।

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

जहां तक ​​टैग के बारे में टिप्पणी अनावश्यक है क्योंकि आपके पास संशोधन संख्या है --- यह काफी हद तक सच है, सिवाय इसके कि टैग भी एक दायरा निर्दिष्ट करते हैं: यानी भंडार में फाइलें टैग द्वारा कवर की जाती हैं। आप उचित रूप से किसी को /svn/proj1/tag/1.0.0 देखने के लिए कह सकते हैं और वे तत्काल एक सुसंगत कार्यक्षेत्र को देख रहे हैं। यदि आप उन्हें संशोधन एक्स देखने के लिए कहते हैं, तो उन्हें पहले यह देखने के लिए संशोधन एक्स को देखना होगा कि यह बदल रहा था (कहें)/svn/proj1/trunk/makefile और इसलिए उस/svn/proj1/trunk/@ एक्स को घटाएं उन्हें देखना चाहिए। क्या होता है यदि संशोधन एक्स ने proj1 और proj2 में फ़ाइलों को छुआ? जो निश्चित रूप से बुरा है, लेकिन कड़ाई से बोलना आपको/svn/proj1/trunk/@ एक्स होना चाहिए। और संशोधन संख्याओं की सूची कहां संग्रहित की जाती है? हम कैसे जानते हैं कि 1.0.0 संशोधन एक्स है? यह आईएमएचओ को यह निर्धारित करना संभव है कि केवल भंडार से।

Git की तरह सिस्टम में, टैग और शाखाओं अभी भी मूल रूप से एक ही बात (सिर्फ वस्तु डेटाबेस के लिए संदर्भ) हैं, लेकिन सम्मेलन कि टैग refs में परिवर्तन नहीं करते है, और शाखा refs एक के साथ क्या (और अधिमानतः वे कैसे बदलते हैं पर विशिष्ट बाधा)। पर्सफोर्स में "लेबल" भी होते हैं जो एक संशोधक के साथ स्वतंत्र रूप से फ़ाइल संशोधन के सेट को समूहबद्ध करने के तरीके हैं; जो अनिवार्य रूप से एक टैग है, लेकिन अधिक भ्रमित है: ऐतिहासिक रूप से हमने परिवर्तनीय संख्याओं (सबवर्सन संशोधन संख्याओं के बराबर) का उपयोग किया है, जो शाखाओं के नाम से योग्य हैं, जिन्हें वे संस्करणों की पहचान करने के लिए होना चाहिए। दोनों लगभग किसी भी तरह से समान हैं, तो यहां मुझे लगता है कि TMTOWTDI।

1

नई बेसलाइन बनाने के दौरान हम टैग (लेबल) का उपयोग करते हैं। हम सप्ताह में एक बार ऐसा करते हैं, लेकिन कुछ टीमें दिन में कई बार भी करती हैं।

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

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

आम तौर पर हम मुख्य शाखा (या आपके एससीएम स्वाद के आधार पर ट्रंक या मास्टर) पर केवल टैग (लेबल) डालते हैं जो अन्य सभी शाखाओं के लिए एकीकरण बिंदु है।

जब हम एक आधिकारिक उत्पाद जारी करते हैं तो हम "इसके लिए रिलीज शाखा" बनाते हैं, इसलिए यह केवल "फिक्स" प्राप्त करेगा जबकि नया विकास "मुख्य" पर रहता है।फिर इन "रखरखाव शाखाओं" (उम्मीद है कि एक समय में केवल एक या दो) को भी टैग किया जा सकता है।

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