मुझे हल्के बनाम एनोटेट टैग की परवाह क्यों करनी चाहिए?


346

मैंने पिछले साल अपने दिन-प्रतिदिन के VCS के रूप में तोड़फोड़ से Git पर स्विच किया और अभी भी "गिट-थिंक" की बारीकियों को समझने की कोशिश कर रहा हूं।

जो मुझे हाल ही में परेशान कर रहा है वह "हल्का" बनाम एनोटेट बनाम हस्ताक्षरित टैग है। ऐसा लगता है कि यह सार्वभौमिक रूप से स्वीकार किया गया है कि एनोटेट किए गए टैग सभी वास्तविक उपयोगों के लिए हल्के टैग से बेहतर हैं, लेकिन मैंने जो स्पष्टीकरण पाया है कि यह मामला हमेशा या तो "क्योंकि सर्वोत्तम प्रथाओं" या "क्योंकि वे अलग-अलग हैं" को उबालते हैं। । दुर्भाग्यवश, यह जाने बिना कि यह सर्वोत्तम प्रथाएं हैं या उन मतभेदों को मेरे जीआईटी उपयोग के लिए कैसे प्रासंगिक हैं , यह जानकर बहुत असंतोषजनक तर्क हैं ।

जब मैंने पहली बार गिट में स्विच किया, तो हल्के-फुल्के टैग कटा हुआ ब्रेड के बाद से सबसे अच्छी चीज लग रहे थे; मैं बस एक कमिट पर इशारा कर सकता था और कह सकता था कि "1.0 था।" मुझे यह समझने में परेशानी हो रही है कि एक टैग को कभी भी इससे अधिक होने की आवश्यकता कैसे हो सकती है, लेकिन मैं निश्चित रूप से विश्वास नहीं कर सकता कि दुनिया के गिट विशेषज्ञ मनमाने ढंग से टैग किए गए टैग पसंद करते हैं! तो सभी हुड़दंग के बारे में क्या है?

(बोनस अंक: मुझे कभी टैग पर हस्ताक्षर करने की आवश्यकता क्यों होगी?)

संपादित करें

मुझे सफलतापूर्वक विश्वास हो गया है कि एनोटेट टैग एक अच्छी बात है - यह जानना कि कौन टैग किया गया है और कब महत्वपूर्ण है! अनुवर्ती के रूप में, अच्छे टैग एनोटेशन पर कोई सलाह? दोनों git tag -am "tagging 1.0" 1.0और पिछले लॉग इन रणनीतियों की तरह महसूस करने के बाद से कमिट को संक्षेप में प्रस्तुत करने की कोशिश कर रहे हैं।


क्या आपको अपने फॉलोअप के लिए एक अच्छा जवाब मिला? कुछ इस तरह? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
'12

पिछले टैग के बाद से कमिट लॉग को सारांशित करना मुझे टैग संदेशों के लिए एक उत्कृष्ट रणनीति की तरह लगता है।
रॉबी

FYI करें (1.) तारीख तक LIGHTWEIGHT टैग सूचीबद्ध करने के लिए, यहां जाएं(२.) दिनांक द्वारा ANNOTATED टैग सूचीबद्ध करने के लिए, यहां जाएं
ट्रेवर बॉयड स्मिथ

जवाबों:


272

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

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

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

संपादित करें:

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

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


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

10
आह-हा! ऐसा लगता है कि यहाँ मेरी समझ इस तथ्य से बाधित थी कि मेरी अब तक की सभी Git परियोजनाएँ एकल रही हैं। मुझे यह जानने की आवश्यकता नहीं है कि किसी के लिए किसे दोष देना है (यह हमेशा मुझे है!), इसलिए मैंने ध्यान नहीं दिया कि हल्के टैग टैगर को ट्रैक नहीं करते हैं।
बेन ब्लैंक

5
git help logअब इसे इस रूप में लिया जाता है: "एनोटेट टैग रिलीज़ के लिए होते हैं जबकि हल्के टैग निजी या अस्थायी ऑब्जेक्ट लेबल के लिए होते हैं।"
जॉन ग्जेंग्सेट

1
@javabrett हालांकि, "एनोटेट और लाइटवेट टैग्स के बीच अंतर क्या हैं" के जवाब का एक अच्छा हिस्सा है, विशेष रूप से यहाँ सवाल यह था कि लोग अतिरिक्त जानकारी क्यों संग्रहीत करना चाहते हैं और इस तरह एनोटेट टैग का उपयोग करना चाहते हैं। (और मुझे नहीं लगता कि मैं गंभीरता से कह सकता हूं "यह एक बूँद बनाता है" एक नकारात्मक पक्ष है - आप वह करते हैं जो आपको स्टोर करने के लिए आवश्यक जानकारी संग्रहीत करने के लिए करना होगा, और यदि यह महत्वपूर्ण जानकारी है, तो इसे एक बूँद की आवश्यकता होगी। )
कैसबेल

1
@ क्रिस हाँ, जैसा कि उत्तर कहता है, "एनोटेट टैग का बड़ा प्लस यह है कि आप जानते हैं कि इसे किसने बनाया है।" आप हमेशा यह जानने के लिए खुद चीजों को आज़मा सकते हैं:git tag -a -m 'my message' my-tag; git show my-tag
Cascabel

64

मेरा व्यक्तिगत, उस विषय पर थोड़ा अलग दृष्टिकोण:

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

4
यह मैन गेट-टैग पर भी उल्लेख किया गया है: "एनोटेट टैग रिलीज़ के लिए हैं जबकि हल्के टैग निजी या अस्थायी ऑब्जेक्ट लेबल के लिए हैं।": stackoverflow.com/a/35059291/895245
Ciro Santilli 郝海东 冠状 man man man man

28

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

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


1
git push --follow-tagsएक और कमांड है जो दोनों को अलग तरह से व्यवहार करता है: stackoverflow.com/a/26438076/895245
Ciro Santilli Sant s s s

1
संकेत के लिए धन्यवाद git describe। मैं इसे निरंतर एकीकरण प्रणाली में उपयोग करता हूं और कई बार संस्करण स्ट्रिंग वह नहीं था जिसकी मुझे उम्मीद थी।
जेजमोंट्स

9

एक टैग पर हस्ताक्षर एक रिलीज की प्रामाणिकता को मुखर करने का एक आसान तरीका है।

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

यदि यह हस्ताक्षर करने के लिए नहीं थे, तो मुझे एनोटेट टैग में अधिक बिंदु दिखाई नहीं देंगे।


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

9

एनोटेट टैग पुश करें, हल्के स्थानीय रखें

कुछ निश्चित व्यवहार उन तरीकों में अंतर करते हैं जो यह अनुशंसा उपयोगी है जैसे:

  • एनोटेट किए गए टैग में एक संदेश, निर्माता और तिथि शामिल हो सकती है, जो उस बिंदु से अलग है जो वे इंगित करते हैं। तो आप उन्हें एक रिलीज कमिट करने के बिना एक रिलीज का वर्णन करने के लिए उपयोग कर सकते हैं।

    लाइटवेट टैग्स में वह अतिरिक्त जानकारी नहीं होती है, और न ही इसकी आवश्यकता होती है, क्योंकि आप केवल इसे स्वयं विकसित करने के लिए उपयोग करने जा रहे हैं।

  • git push-follow- टैग केवल एनोटेट टैग को पुश करेगा
  • git describe कमांड लाइन विकल्पों के बिना केवल एनोटेट टैग देखता है

man git-tag कहते हैं:

एनोटेटेड टैग रिलीज़ के लिए होते हैं जबकि हल्के टैग निजी या अस्थायी ऑब्जेक्ट लेबल के लिए होते हैं।

आंतरिक अंतर

  • लाइटवेट और एनोटेट दोनों टैग एक फ़ाइल है जिसके तहत .git/refs/tagsSHA-1 है

  • हल्के टैग के लिए, SHA-1 सीधे एक कमेटी को इंगित करता है:

    git tag light
    cat .git/refs/tags/light
    

    HEAD के SHA-1 के समान प्रिंट करता है।

    इसलिए कोई आश्चर्य नहीं कि उनमें कोई अन्य मेटाडेटा नहीं हो सकता।

  • एनोटेट टैग ऑब्जेक्ट डेटाबेस में एक टैग ऑब्जेक्ट को इंगित करता है।

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    इसमें एनोटेट टैग ऑब्जेक्ट का SHA है:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    और तब हम इसकी सामग्री प्राप्त कर सकते हैं:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    नमूना उत्पादन:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    और यह है कि इसमें अतिरिक्त मेटाडेटा शामिल है। जैसा कि हम आउटपुट से देख सकते हैं, मेटाडेटा फ़ील्ड हैं:

    प्रारूप का अधिक विस्तृत विश्लेषण यहां मौजूद है: गिट टैग ऑब्जेक्ट का प्रारूप क्या है और इसके SHA की गणना कैसे करें?

बोनस


6

मुझे हल्के टैग्स के लिए एक अच्छा उपयोग मिला है - रेट्रोस्पेक्टिव में GitHub पर एक रिलीज बना रहा है।

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

अगर हम सिर्फ एक पुराने कमिट पर एक एनोटेट टैग बनाएंगे, तो GitHub टैग ऑब्जेक्ट से रिलीज के लिए तारीख लेगा। इसके विपरीत, जब हमने इस पुरानी प्रतिबद्ध के लिए एक हल्का टैग बनाया है, तो रिलीज ने सही (पुरानी) तारीख दिखाना शुरू कर दिया। Source @ GitHub मदद, 'रिलीज़ के बारे में'

ऐसा लगता है कि किसी एनोटेट कमिट के लिए अपनी वांछित तिथि बताना भी संभव है, लेकिन यह मुझे उतना आसान नहीं लगता है: https://www.kernel.org/pub/software/scm/git/docs/git-tag। एचटीएमएल # _on_backdating_tags


हालांकि आज मुझे पता चला है कि GitHub ने मेरे लिए टैग की तारीखों को रोक दिया है (हल्के और अनूदित टैग दोनों के लिए)। यह रिलीज को प्रकाशित करते समय सिर्फ तारीख की अवहेलना करता है और इसके बजाय रिलीज की तारीख और समय को याद करता है जब मैंने रिलीज के लिए "प्रकाशित" बटन दबाया था।
दुष्टकोस

हाँ, मैं भी GitHub और एनोटेट टैग के बारे में इस गड़बड़ी पर ठोकर खाई है। मुझे नहीं मिला कि उन्होंने इसे इस तरह से क्यों लागू किया ..
याकोवैल

1

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


0

एनोटेटेड टैग अतिरिक्त मेटाडेटा जैसे कि लेखक का नाम, रिलीज़ नोट्स, टैग-संदेश और दिनांक को Git डेटाबेस में पूर्ण ऑब्जेक्ट के रूप में संग्रहीत करते हैं। यह सभी डेटा आपके प्रोजेक्ट की सार्वजनिक रिलीज़ के लिए महत्वपूर्ण है।

git टैग -a v1.0.0

लाइटवेट टैग आपके गिट रिपॉजिटरी में एक टैग जोड़ने का सबसे सरल तरीका है क्योंकि वे केवल उस कमिट के हैश को स्टोर करते हैं जिसे वे संदर्भित करते हैं। वे "बुकमार्क" की तरह कार्य कर सकते हैं, जैसे, वे निजी उपयोग के लिए महान हैं।

git टैग v1.0.0

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


0

मेरे लिए महत्वपूर्ण अंतर हल्का टैग है टाइमस्टैम्प नहीं है। मान लें कि आपने कई हल्के टैग जोड़े हैं:

git tag v1
git tag v2
git tag v3

और फिर, हो सकता है कि बाद में, आप अंतिम जोड़ा गया हल्का टैग प्राप्त करना चाहते हैं। इसका कोई उपाय नहीं है। न तो "git वर्णन" और न ही "git टैग" आपको कालानुक्रमिक रूप से अंतिम हल्के टैग नहीं देगा। "git टैग -l" उन सभी को वापस कर सकता है या उन्हें लेक्स क्रम में सॉर्ट कर सकता है, लेकिन दिनांक / समय के अनुसार नहीं। "git description --tags" "v1" लौटाएगा जो निश्चित रूप से अंतिम जोड़ा टैग नहीं है।

दूसरी ओर, यदि आप एनोटेट टैग जोड़ते हैं:

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

आपको हमेशा हर टैग का टाइमस्टैम्प मिल सकता है और "git वर्णन" निश्चित रूप से "v3" लौटाएगा जो वास्तव में अंतिम जोड़ा टैग है।


आपको एनोटेट होने के लिए -a का उपयोग करना होगा।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.