"टैग पहले से ही रिमोट में मौजूद है" गिट टैग को फिर से बनाने के बाद त्रुटि


142

नीचे दिए गए चरणों को चलाने के बाद मुझे निम्नलिखित त्रुटि मिलती है:

To git@provider.com:username/repo-name.git
 ! [rejected]        dev -> dev (already exists)
error: failed to push some refs to 'git@provider.com:username/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
  1. भंडार का निर्माण किया
  2. स्थानीय मशीन पर रेपो का क्लोन बनाया।
  3. README फ़ाइल को संशोधित किया, परिवर्तनों को शुरू किया और प्रतिबद्ध को धक्का दिया।
  4. बनाया गया टैग dev:git tag dev
  5. पुश किए गए टैग: git push --tags
  6. README फ़ाइल को संशोधित किया, परिवर्तनों को शुरू किया और प्रतिबद्ध को धक्का दिया।
  7. हटाए गए टैग dev, इसे फिर से बनाया गया और टैग हटा दिए गए :

    git tag -d dev
    git tag dev
    git push --tags
    

ये क्यों हो रहा है?

मैं मैक पर हूँ। मेरे दोस्त जो लिनक्स (उबंटू) का उपयोग करते हैं, उन्हें यह समस्या नहीं है। मुझे पता है कि मैं git push --tags -fटैग अपडेट को बाध्य करने के लिए उपयोग कर सकता हूं , लेकिन यह खतरनाक है (उदाहरण के लिए केवल टैग में गलती से किए गए एक वचन को फिर से लिखना, शाखा में नहीं)।


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

8
यह मेरे लिए git pull --tagsतब काम करता थाgit push origin --tags
sawe

यह भी देखें stackoverflow.com/questions/31929667/…
icc97

जवाबों:


175

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

Git 2.10 / 2.11 में परीक्षण से पता चलता है कि पुराने टैग को बनाए रखना क्लाइंट्स को चलाने के लिए डिफ़ॉल्ट व्यवहार है git fetch, और अपडेट करना क्लाइंट्स के रनिंग के लिए डिफ़ॉल्ट व्यवहार है git fetch --tags

(मूल उत्तर इस प्रकार है।)


जब आप टैग को पुश करने के लिए कहते हैं, तो git push --tagsभेजता है (किसी भी तरह के कमिट और अन्य ऑब्जेक्ट के साथ और पुश सेटिंग्स से किसी भी अन्य रेफरी अपडेट को) रिमोट के अपडेट रिक्वेस्ट को । (खैर, यह हालांकि कई भेजता है: प्रत्येक टैग के लिए उनमें से एक)new-sha1 refs/tags/name

अद्यतन अनुरोध को रिमोट द्वारा old-sha1(या फिर, प्रत्येक टैग के लिए एक) जोड़ने के लिए संशोधित किया जाता है , फिर पूर्व-प्राप्त और / या अपडेट हुक (जो भी रिमोट पर मौजूद होते हैं) के लिए दिया जाता है। वे हुक तय कर सकते हैं कि टैग बनाने / हटाने / अपडेट करने की अनुमति दें या अस्वीकार करें।

यदि old-sha1मान बनाया जा रहा है तो मान ऑल-ज़ीरो "null" SHA-1 है। new-sha1अशक्त SHA-1 यदि टैग हटाया जा रहा है। अन्यथा दोनों SHA-1 मान वास्तविक, मान्य मान हैं।

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

लेकिन, यहां यह समझने की कुंजी है कि क्या चल रहा है - इस git pushकदम का कोई पता नहीं है कि रिमोट में अब टैग है और यदि हां, तो SHA-1 का क्या मूल्य है। यह केवल कहता है "यहां टैग की पूरी सूची है, साथ ही उनके SHA-1 मान"। रिमोट मूल्यों की तुलना करता है और यदि जोड़ और / या परिवर्तन हैं, तो उन पर हुक चलाता है। (टैग के लिए जो समान हैं, वह कुछ भी नहीं करता है। टैग के लिए आपके पास ऐसा नहीं है कि वे करते हैं, यह भी कुछ नहीं करता है!)

यदि आप स्थानीय रूप से टैग हटाते हैं, तो push, आपका पुश केवल टैग को स्थानांतरित नहीं करता है। रिमोट मानता है कि कोई बदलाव नहीं किया जाना चाहिए।

यदि आप स्थानीय रूप से टैग हटाते हैं, तो इसे एक नई जगह की ओर इशारा करते हुए बनाएं, फिर push, आपका पुश टैग को स्थानांतरित करता है, और रिमोट इसे टैग-परिवर्तन के रूप में देखता है और परिवर्तन को अस्वीकार करता है, जब तक कि यह एक बल-धक्का न हो।

इस प्रकार, आपके पास दो विकल्प हैं:

  • एक बल-धक्का करो, या
  • रिमोट पर टैग हटाएं।

उत्तरार्द्ध है के माध्यम से संभव git push2 भले ही टैग स्थानीय रूप से हटाने और pushing कोई प्रभाव नहीं है। मान लिया गया कि रिमोट का नाम है origin, और वह टैग जिसे आप हटाना चाहते हैं dev:

git push origin :refs/tags/dev

यह रिमोट को टैग हटाने के लिए कहता है। devआपके स्थानीय भंडार में टैग की मौजूदगी या अनुपस्थिति अप्रासंगिक है; Refspec के pushसाथ इस तरह का , एक शुद्ध-हटाने वाला धक्का है।:remoteref

रिमोट टैग हटाने (जोड़े गए किसी अतिरिक्त हुक के आधार पर) की अनुमति दे भी सकता है और नहीं भी। यदि यह हटाने की अनुमति देता है, तो टैग चला जाएगा, और एक git push --tags, जब आपके पास devकुछ प्रतिबद्ध या एनोटेट टैग रेपो ऑब्जेक्ट की ओर इशारा करते हुए एक स्थानीय टैग होता है, तो अपना नया devटैग भेजें । रिमोट पर, devअब एक नया बना टैग होगा, इसलिए रिमोट शायद पुश को अनुमति देगा (फिर से यह किसी भी अतिरिक्त हुक पर निर्भर करता है)।

बल-धक्का सरल है। आप अद्यतन कुछ भी करने के लिए सुनिश्चित नहीं होना चाहते हैं अन्य टैग की तुलना में, बस बता git pushही है कि एक refspec पुश करने के लिए:

git push --force origin refs/tags/dev:refs/tags/dev

(ध्यान दें: --tagsयदि आपको स्पष्ट रूप से सिर्फ एक टैग रेफ-स्पेक दिया जा रहा है तो आपको इसकी आवश्यकता नहीं है )।


1 बेशक, कारण इस में निर्मित हुक मदद करने के लिए है व्यवहार को लागू करने के लिए है कि के अन्य उपयोगकर्ताओं है कि एक ही रिमोट रेपो उम्मीद: कि शाखाओं rewound नहीं हैं, और टैग के लिए कदम नहीं है। यदि आप बल-धक्का करते हैं, तो आपको दूसरे उपयोगकर्ताओं को यह बताने देना चाहिए कि आप ऐसा कर रहे हैं, ताकि वे इसके लिए सही हो सकें। ध्यान दें कि "टैग बिल्कुल नहीं चलते हैं" Git 1.8.2 द्वारा नया लागू किया गया है; पिछले संस्करण टैग को "ग्राफ में आगे बढ़ने" की अनुमति देते हैं, शाखा नामों की तरह। जीआईटी 1.8.2 रिलीज नोट देखें ।

2 यदि आप रिमोट पर लॉग इन कर सकते हैं तो यह तुच्छ है। बस Git रिपॉजिटरी में जाएं और वहां दौड़ें git tag -d dev। ध्यान दें कि किसी भी तरह से - रिमोट पर टैग git pushको हटाना , या इसे हटाने के लिए उपयोग करना - एक समय की अवधि है जब रिमोट को एक्सेस करने वाला कोई भी व्यक्ति यह पाएगा कि devटैग गायब है। (वे जारी रहेगा अपने स्वयं के पुराने टैग, अगर वे पहले से ही यह है, और वे भी धक्का सकता है उनके पुराने टैग वापस ऊपर इससे पहले कि आप नया एक धक्का कर सकते हैं।)


क्या यह केवल गिट के नए संस्करणों में हो रहा है? मेरे पास 1.7.9.5और मेरे पास यह मुद्दा नहीं है ...
Ionică Bizău

2
Probalby- मेरे पास git push --tagsपुराने संस्करणों में स्वचालित रूप से टैग बदलने की एक अस्पष्ट स्मृति है , बिना --force। मैंने इसका परीक्षण 1.8.4 के तहत किया था, और आपको इसकी आवश्यकता है --force, या दो चरण की अद्यतन तकनीक।
torek

2
@ जॉन:: अपडेट: रिलीज नोटों के अनुसार यह १. as.२ के रूप में नया व्यवहार है । मैं इसे फुटनोट 1 में भी संपादित करूँगा।
torek

पता नहीं कैसे मैं इस स्थिति में आ गया, लेकिन यह एक टैग हटा दिया गया और एक ट्राइस में पुनः बनाया गया।
रिग्सफॉली

4
यदि आप एक जेडी को बल-पुश कैसे करते हैं?
फॉनिक्स

54

मैक सोर्सट्री में केवल पुश को सभी टैग चेकबॉक्स से हटा दें:

यहां छवि विवरण दर्ज करें


3
हाहाहा इतना सीधा-सादा आदमी, मैं स्वीकृत जवाब पढ़ रहा था और मुझे लगा कि मैं इसे फेक रहा हूं
MegaManX

10
यह वास्तव में समस्या को हल किए बिना इसे दूर करना है। यह रिमोट और स्थानीय पर टैग नाम मिस मैच को हल नहीं करता है।
amalBit

1
विंडोज़ संस्करण के लिए भी काम करता है! हमें लंबे समय तक स्वीकार किए गए उत्तर को पढ़ने से बचाने के लिए धन्यवाद, जो कि सॉकेट्री उपयोगकर्ताओं को छोड़ देता है, जो परवाह नहीं करते हैं कि कमांड प्रॉम्प्ट में क्या चल रहा है :)
schlingel

19

यदि आप SourceTree का उपयोग कर रहे हैं तो यह काफी सरल है

यहां छवि विवरण दर्ज करें मूल रूप से आपको केवल विरोधी टैग को हटाने और जोड़ने की आवश्यकता है:

  1. टैब रिपॉजिटरी में जाएं -> टैग -> टैग निकालें
  2. परस्पर विरोधी टैग नाम का चयन करें
  3. सभी रीमोट से निकालें टैग की जाँच करें
  4. निकालें दबाएं
  5. उचित कमिट के लिए समान नाम के साथ नया टैग बनाएं
  6. दूरस्थ में अपने परिवर्तनों को धकेलते समय सभी टैगों को जांचना सुनिश्चित करें

16

यदि आप एक टैग को अद्यतन करना चाहते हैं , तो हम इसे कहते हैं1.0.0

  1. git checkout 1.0.0
  2. अपने बदलाव करें
  3. git ci -am 'modify some content'
  4. git tag -f 1.0.0
  5. जीथब पर रिमोट टैग हटाएं: git push origin --delete 1.0.0
  6. git push origin 1.0.0

किया हुआ


12

ऐसा लगता है कि मुझे इस मुद्दे पर देर हो चुकी है और / या यह पहले ही उत्तर दिया जा चुका है, लेकिन, क्या किया जा सकता है: (मेरे मामले में, मेरे पास स्थानीय रूप से केवल एक ही टैग था .. मैंने पुराने टैग को हटा दिया और इसे फिर से जोड़ दिया :

git tag -d v1.0
git tag -a v1.0 -m "My commit message"

फिर:

git push --tags -f

जो रिमोट पर सभी टैग को अपडेट करेगा ।

खतरनाक हो सकता है! अपने जोखिम पर उपयोग करें।


1
यह मेरे लिए यह किया है! टैग केवल स्थानीय थे और रिमोट में नहीं थे :)
pgarciacamou

4

आपके द्वारा अस्वीकृत किए जाने का कारण यह है कि आपका टैग दूरस्थ संस्करण के साथ सिंक खो गया है। शाखाओं के साथ भी यही व्यवहार है।

रिमोट के माध्यम से टैग के साथ सिंक करें और सिंक करने के git pull --rebase <repo_url> +refs/tags/<TAG>बाद, आपको संघर्षों को प्रबंधित करने की आवश्यकता है । यदि आपके पास एक diftool स्थापित है (उदा। मेल्ड) git mergetool meldइसका उपयोग रिमोट को सिंक करने और अपने परिवर्तनों को रखने के लिए करें।

जिस कारण से आप --rebase ध्वज को खींच रहे हैं, वह यह है कि आप अपने काम को रिमोट के शीर्ष पर रखना चाहते हैं ताकि आप अन्य उलझनों से बच सकें।

इसके अलावा, जो मुझे समझ नहीं आ रहा है वह यह है कि आप devटैग को हटाकर फिर से क्यों बनाएंगे ??? टैग का उपयोग सॉफ्टवेयर संस्करण या मील के पत्थर को निर्दिष्ट करने के लिए किया जाता है। Git टैग का उदाहरण v0.1dev, v0.0.1alpha, v2.3-cr(करोड़ - उम्मीदवार विज्ञप्ति) और इतने पर ..


एक और तरीका है कि आप इसे हल कर सकते हैं एक मुद्दा है git reflogऔर उस क्षण पर जाएं जब आपने devरिमोट पर टैग को धकेल दिया था । कमिट आईडी को कॉपी करें और git reset --mixed <commmit_id_from_reflog>इस तरह से आप जानते हैं कि आपका टैग उस समय रिमोट के साथ सिंक हो गया था जिस समय आपने इसे पुश किया था और कोई विरोध नहीं होगा।


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


0

कुछ अच्छे जवाब यहाँ। खासकर @torek द्वारा । मैंने सोचा कि मैं इस काम को एक भीड़ में उन लोगों के लिए थोड़ा स्पष्टीकरण के साथ जोड़ दूंगा।

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

काम के आसपास टैग को हटाना है (और सभी रिमूव को हटा दें)। फिर वही टैग बनाएं और पुश करें।

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