क्या जीआईटी टैग को भी धक्का दिया जाता है?


188

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

समस्या क्या हो सकती है?।


3
git push --follow-tagsअब उपयोगी हो सकता है, नीचे मेरा जवाब देखें
VonC


1
डुप्लिकेट से सहमत: हालांकि यह पुराना है, दूसरा प्रश्न बेहतर है।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 ''

जवाबों:


244

आप ऐसा कर सकते हैं:

git push --tags

27
मुझे पूरा यकीन है कि इसका मतलब है कि HEAD refs को धक्का नहीं दिया जाएगा, जिसका अर्थ है कि आप केवल टैग पुश करते हैं।
डैन रोसेनस्टार्क

47
"मैं सलाह देता हूं कि दूसरों का उपयोग करने के लिए प्रशिक्षण या प्रशिक्षण का उपयोग न करें git push --tagsक्योंकि बुरे टैग से छुटकारा पाना बहुत मुश्किल हो सकता है जब आपके सहकर्मियों को सभी टैगों को पुश करने के लिए प्रशिक्षित किया जाता है, क्योंकि लोग पुराने खराब टैगों को धक्का देना जारी रखते हैं जो उनके पास हर बार स्थानीय रूप से होते हैं। एक नए टैग को आगे बढ़ाना चाहता हूं। इस वजह से, मैं केवल किसी को git push origin <tag_name>अब उपयोग करने की सलाह दूंगा । " - stackoverflow.com/a/5195913/4130619
गतिविधि

मुझे लगता है कि अन्य जवाब, stackoverflow.com/a/16164809/11635 को स्वीकार किया जाना चाहिए। यहां तक ​​कि अगर नहीं, तो यह निश्चित रूप से पढ़ा जाना चाहिए - यह पेशेवरों और विपक्षों और अंततः आज के लिए एक अधिक व्यावहारिक और सही जवाब प्रदान करता है
रूबेन बार्टेलिंक

139

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

$ git push <remote> tag <tagname>

एक टैग को पुश करने के लिए, या

$ git push <remote> --tags

सभी टैग git push --tagsपुश करने के लिए (या डिफ़ॉल्ट रिमोट पर पुश करने के लिए, आमतौर पर origin)।

यह बहुत ही इच्छित व्यवहार है, जिससे पुश टैग्स को स्पष्ट किया जा सके। पुशिंग टैग आमतौर पर सचेत पसंद होना चाहिए।


Junio ​​C. Hamano ने जो लिखा उसे संक्षेप में (@Andre Miras द्वारा टिप्पणियों में जोड़ा गया)

जब आप ला रहे हैं, तो आप किसी दूरस्थ रिपॉजिटरी के साथ बातचीत कर रहे हैं जिसे किसी ने प्रकाशित किया है, जिसका अर्थ है:

  1. टैग के सेट मौजूद हैं जो सभी प्रकाशक चाहते थे कि लोग देखें, और
  2. न केवल आप बल्कि अन्य लोग भी इसी टैग को देखेंगे।

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

इसीलिए git fetchस्वचालित रूप से "टैग्स" का अनुसरण किया जाता है, अर्थात जब वे संशोधन डाउनलोड करते हैं तो वे टैग को इंगित करते हैं - दूसरे शब्दों में सभी प्रासंगिक प्रकाशित टैग डाउनलोड करते हैं।

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

इसलिए आपको टैग को सार्वजनिक रूप से चिह्नित करने के लिए, टैग को स्पष्ट रूप से पुश करने की आवश्यकता है।


वैकल्पिक रूप से आप उन रिमोट को कॉन्फ़िगर कर सकते हैं जिन्हें आप हमेशा सभी टैगों को धकेलने के लिए धक्का देते हैं, उदाहरण के लिए ऐसा कुछ अपने में डालें .git/config:

[रिमोट "प्रकाशित"] # या जो भी नाम दिया गया है
    url = ...
    धक्का = + रेफ्स / सिर / *: रेफ्स / सिर / *
    धक्का = + refs / टैग / *: refs / टैग / *

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


क्या यह हमेशा सभी प्रमुखों का 'बल धक्का' नहीं करता है?
स्टीफन न्वे

@ सफ़्फ़ान: हाँ यह करता है। अपडेट किया गया।
जकूब नारबस्की '

19
"यह बहुत ही अभिप्रायित व्यवहार है, जिससे टैगिंग को स्पष्ट किया जा सके। पुशिंग टैग को आमतौर पर सचेत पसंद होना चाहिए।" मैं औचित्य नहीं समझता। क्या आप इस बात पर विस्तार से बता सकते हैं कि Git के लिए टैग को स्वचालित रूप से पुश करना क्यों बुरा होगा?
रेयान लुंडी

13
@Kyralessa, इस पोस्ट में git.661346.n2.nabble.com/… , Junio ​​C Hamano (Git के वर्तमान अनुरक्षक) बताते हैं कि क्यों यह स्वचालित रूप से पुश पुश करने के लिए एक बुरी बात है।
आंद्रे मिरास

@AndreMiras इस भयानक लिंक के लिए धन्यवाद। अच्छा होगा यदि हम जूनियो के पोस्ट को इस उत्तर में एकीकृत कर सकें।
होमर 6

67

ध्यान दें कि जीआईटी 1.8.3 (अप्रैल 22, 2013) के बाद से , आपको शाखाओं को पुश करने के लिए 2 कमांड करने की ज़रूरत नहीं है, और फिर देखने के लिए पुश करें:

नई " --follow-tags" विकल्प बताता है " git push" प्रासंगिक एनोटेट टैग को पुश करने के लिए जब शाखाओं को बाहर धकेल दिया जाता है

अब आप कोशिश कर सकते हैं, जब नया धक्का लगे:

git push --follow-tags

हालांकि यह सभी स्थानीय टैग को धक्का नहीं देगा , केवल उन एनोटेट व्यक्तियों को संदर्भित करता है जो कमिट करते हैं, जिनके साथ धक्का दिया जाता है git push


यह जूनियो सी gitsterहमानो ( ) द्वारा प्रतिबद्ध c2aba15 में पेश किया गया है :

नया विकल्प एनोटेट टैग को पुश करने के लिए " --follow-tags" बताता है " git push" जो कि दूसरी तरफ से गायब है और जिसे उस इतिहास तक पहुँचा जा सकता है जिसे अन्यथा बाहर धकेला गया है।

उदाहरण के लिए, यदि आप " simple", " current", या " upstream" पुश का उपयोग कर रहे हैं, तो आप आमतौर पर इतिहास को आपके वर्तमान में प्रतिबद्ध करेंगे HEADऔर कुछ नहीं।
इस विकल्प के साथ, आप उन सभी एनोटेट टैग्स को भी धकेल देंगे जिन्हें उस ओर से दूसरी ओर तक पहुँचा जा सकता है।


कॉन्फ़िगरेशन डिफ़ॉल्ट रूप push.followTagsसे शामिल करने की अनुमति देता है --follow-tags(Git 2.4.1+, Q2 2015)। " पुश जीट कमिट्स एंड टैग्स एक साथ देखें "


3
यह केवल सभी एनोटेट टैग को धकेलता है । अधिकांश लोग / परियोजनाएं हल्के टैग का उपयोग कर रहे हैं । तो ज्यादातर मामलों में git push --follow-tagsअधिक से अधिक धक्का नहीं हैgit push
जारल

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

: @VonC: अब वहाँ भी है कि इस डिफ़ॉल्ट बनाता है एक config विकल्प नहीं है, जैसा कि आप यहाँ उल्लेख किया stackoverflow.com/a/3745250/946850
krlmlr

19

मैं आमतौर पर क्या करता हूं:

[रिमोट "प्रकाशित"] # या जो भी नाम दिया गया है
    url = ...
    धक्का =:
    धक्का = + refs / टैग / *: refs / टैग / *

मतलब यह हर उस शाखा को आगे बढ़ाता है जो पहले से ही है, साथ ही साथ टैग। यह पुश को बल नहीं देता है, और यह शाखा को धक्का नहीं देता है कि आपने मैन्युअल रूप से धक्का नहीं दिया था।


क्या मैं अपने उपयोगकर्ता के वैश्विक git config में भी डाल सकता हूँ? यदि हाँ, तो कैसे? धन्यवाद! :)
गुड्डी

ऐसा लगता है कि आप टैग को मजबूर कर रहे हैं, लेकिन शाखाओं को नहीं।
एड्रियन रत्नपाल

खैर, हां, और नहीं, मैंने लिखा है कि, यह नए टैगों को आगे बढ़ाएगा, यह उन्हें धक्का नहीं देगा, और यह उन शाखाओं को धक्का नहीं देगा जिन्हें आपने पहले से ही धक्का नहीं दिया है।
चटाई

मैंने जैकब के सुझाव की कोशिश की, लेकिन यह उन शाखाओं को आगे बढ़ा रहा था जो मैं केवल स्थानीय स्तर पर चाहता था। यह सुझाव, चटाई, सही काम करता है। यह टैग्स को सिंक करता है, लेकिन जब तक वे रिमोट ट्रैकिंग शाखाएं नहीं हैं, तब तक वे शाखाओं को सिंक नहीं करते हैं (यानी यह नई शाखाओं को रिमोट तक नहीं पहुंचाएगा, लेकिन अगर वे रिमोट में हैं तो उन्हें अपडेट कर देंगे)। ध्यान दें: यदि आपके पास एक टैग और एक ही नाम वाला एक शाखा है जो आपको "एक से अधिक" त्रुटि से मिलता है। Lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ का संदर्भ लें ।
जोसेफडॉर्लस

5

और यदि आप सभी टैगों को लाना चाहते हैं, तो आप इसे इसके द्वारा कॉन्फ़िगर कर सकते हैं:

git config remote.origin.tagopt --tags

डॉक्स से:

इस मान को --no- टैग पर सेट करना दूरस्थ से लाते समय स्वचालित टैग को अक्षम करता है। इसे -टैग पर सेट करना हर टैग को रिमोट से प्राप्त करना होगा, भले ही वे रिमोट ब्रांच हेड से उपलब्ध न हों। इन झंडों को सीधे git-fetch (1) पास करना इस सेटिंग को ओवरराइड कर सकता है। विकल्प देखें - gags-fetch (1) के -tags और -no- टैग।


1
सवाल अधिक 'पुश' उन्मुख था, क्या आपका जवाब रिमोट पर पुश करने पर भी लागू होता है?
a1an
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.