आप एक Git टैग का नाम कैसे बदल सकते हैं?


1219

आज मैं एक परियोजना के लिए लॉग के माध्यम से देख रहा था और मुझे एहसास हुआ कि मैंने कुछ समय पहले एक टैग नाम को मोटा कर दिया था। क्या टैग का नाम बदलने का कोई तरीका है? Google ने कुछ भी उपयोगी नहीं किया है।

मुझे लगता है कि मैं टैग किए गए संस्करण की जांच कर सकता हूं और एक नया टैग बना सकता हूं, मैंने भी कोशिश की। लेकिन यह एक टैग ऑब्जेक्ट बनाने के लिए लगता है जो काफी सही नहीं है। एक के लिए,

git tag -l

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


क्या आपने एक ही मंगलाचरण का उपयोग किया था, अर्थात यदि पुराने टैग को एनोटेट / हस्ताक्षरित टैग किया गया था, तो क्या नया टैग भी इस तरह का है, या यह हल्का टैग है?
जकुब नरबसकी

1
गलत पुराने टैग और वांछित नए टैग दोनों को एनोटेट और अहस्ताक्षरित किया जाना चाहिए। पुराना टैग 'git टैग -a bad_tag_name' के साथ बनाया गया था, इसलिए मैं 'git टैग -a good_tag_name' की तर्ज पर कुछ करना चाहूंगा।
ब्रैंडन फॉसडिक

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

7
git log --oneline --decorate --graphटैग्स को साफ करते समय मददगार है।
जोएल पुर्रा

आप एक पंक्ति में एक टैग का नाम बदल सकते हैं: नीचे मेरा जवाब देखें
वॉन

जवाबों:


2037

यहाँ बताया गया है कि मैं एक टैग oldका नाम कैसे बदलूं new:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

पुश कमांड में कोलोन रिमोट रिपॉजिटरी से टैग को हटा देता है। यदि आप ऐसा नहीं करते हैं, तो आपके खींचने पर Git आपकी मशीन पर पुराना टैग बनाएगा।

अंत में, सुनिश्चित करें कि अन्य उपयोगकर्ता हटाए गए टैग को हटा दें। कृपया उन्हें (सह-कार्यकर्ता) निम्नलिखित कमांड चलाने के लिए कहें:

git pull --prune --tags

ध्यान दें कि यदि आप एक एनोटेट टैग को बदल रहे हैं , तो आपको यह सुनिश्चित करने की आवश्यकता है कि नया टैग नाम अंतर्निहित प्रतिबद्ध को संदर्भित कर रहा है न कि पुराने एनोटेट टैग ऑब्जेक्ट को जिसे आप डिलीट करने वाले हैं। इसलिए, git tag -a new old^{}इसके बजाय का उपयोग करें git tag new old(यह इसलिए है क्योंकि एनोटेट टैग ऑब्जेक्ट हैं जबकि हल्के टैग इस उत्तर में अधिक जानकारी नहीं हैं )।


19
यदि टैग एनोटेट किया जाता है तो नए टैग में पुराने का संदेश नहीं होगा, लेकिन यह एक उपयोगी जानकारी है
NickSoft

25
@NickSoft, मैंने एनोटेट टैग के साथ उपरोक्त किया है। संदेशों को पुराने से नए में ठीक-ठीक कॉपी किया गया था। शायद मेरे पास गिट का एक नया संस्करण है?
कतहफ

25
git push origin :refs/tags/oldgit push origin :oldमुझे लगता है कि सरलीकृत किया जा सकता है।
जेसी ग्लिक

25
मैं इस टैग को "git push --tags" बदलने का सुझाव दूंगा जो इस टैग के लिए अधिक स्पष्ट हो "git push origin refs / tags / new"। आप अनजाने में अन्य टैग को धक्का नहीं देना चाहते हैं।
Chrish

11
चेतावनी : उपयोग git tag new oldपुराने टैग की ओर इशारा करते हुए एक टैग बनाएगा, कि पुराने टैग की प्रतिबद्धता। (देखें कि मैं GIT GUI से अपने टैग की जांच क्यों नहीं कर सकता? )
Stevoisiak

297

मूल प्रश्न था कि किसी टैग का नाम कैसे बदला जाए, जो आसान है: पहले NEW को OLD के उपनाम के रूप में बनाएं: git tag NEW OLDफिर OLD को हटाएं git tag -d OLD

"द गेट वे" और (इन) पवित्रता के बारे में उद्धरण बंद है, क्योंकि यह एक टैग नाम को संरक्षित करने के बारे में बात कर रहा है, लेकिन यह एक अलग भंडार राज्य का संदर्भ देता है।


3
उपरोक्त उत्तर थोड़ा बेहतर है क्योंकि इसमें git push originव्यवसाय शामिल है ।
रोली

सबसे आसान तरीका, Gitflow के साथ बनाए गए पिछले रिलीज़ टैग का नाम बदलने के लिए महान काम
RousseauAlexandre

5
चेतावनी : उपयोग git tag new oldपुराने टैग की ओर इशारा करते हुए एक टैग बनाएगा, कि पुराने टैग की प्रतिबद्धता। (देखें कि मैं GIT GUI से अपने टैग की जांच क्यों नहीं कर सकता? )
Stevoisiak

118

अन्य उत्तरों के अलावा:

सबसे पहले आप एक का निर्माण करने की आवश्यकता है उर्फ का वर्ष टैग नाम, मूल की ओर इशारा करते प्रतिबद्ध:

git tag new old^{}

फिर आपको पुराने को स्थानीय रूप से हटाने की आवश्यकता है :

git tag -d old

फिर आप दूरस्थ स्थान पर टैग हटाएं:

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

अंत में आपको दूरस्थ स्थान पर अपना नया टैग जोड़ना होगा। जब तक आप ऐसा नहीं करते, नया टैग नहीं जोड़ा जाएगा:

git push origin --tags

प्रत्येक दूरस्थ स्थान के लिए इसे अलग करें।

ध्यान रखें, निहितार्थ कि एक पैकेज के उपभोक्ताओं के लिए एक Git टैग परिवर्तन है !


चेतावनी : उपयोग git tag new oldपुराने टैग की ओर इशारा करते हुए एक टैग बनाएगा, कि पुराने टैग की प्रतिबद्धता। (देखें कि मैं GIT GUI से अपने टैग की जांच क्यों नहीं कर सकता? )
Stevoisiak

1
@StevenVascellaro लिंक के लिए धन्यवाद। अगली बार, कृपया संपादित करें - उत्तर देना सामुदायिक प्रयास है। धन्यवाद।
कैसर

मैंने कोई संपादन नहीं किया क्योंकि मैंने अभी तक अपने लिए कोड का परीक्षण नहीं किया है। (जुड़े प्रश्न पर सबमिट दिनांक पर ध्यान दें)
Stevoisiak

एक बार जब हम करते हैं git tag new old^{}, तो हमें git tag new_tag_name old_tag_name(पहले चरण) की आवश्यकता नहीं होती है ।
नंबर 945

28

यदि यह प्रकाशित हुआ है, तो आप इसे नष्ट नहीं कर सकते (बिना टारगेट और पंख वाले, वह है)। 'गेट तरीका' करना है:

संत की बात। बस आप को पता है, और एक अलग नाम का उपयोग करें। दूसरों ने पहले से ही एक टैग-नाम देखा है, और यदि आप एक ही नाम रखते हैं, तो आप इस स्थिति में हो सकते हैं कि दो लोगों के पास "संस्करण X" है, लेकिन उनके पास वास्तव में अलग "X" है। तो बस इसे "X.1" कहें और इसके साथ किया जाए।

वैकल्पिक रूप से,

पागल बात है। आप वास्तव में नए संस्करण "एक्स" को भी कॉल करना चाहते हैं, भले ही दूसरों ने पहले से ही पुराने को देखा हो। तो बस फिर से git-tag -f का उपयोग करें, जैसे कि आपने पहले से पुराना प्रकाशित नहीं किया था।

यह बहुत पागलपन है क्योंकि:

Git वापस उपयोगकर्ताओं के पीछे टैग नहीं बदलता (और यह नहीं होना चाहिए)। तो अगर किसी को पहले से ही पुराना टैग मिल गया है, तो अपने पेड़ पर गिट-पुलिंग करना बस उन्हें पुराने को अधिलेखित नहीं करना चाहिए।

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

आदमी पृष्ठों के सभी शिष्टाचार ।


6
या आप गलत नाम से टैग कर सकते हैं (गलत नाम से)।
जकुब नरबसकी

6
धन्यवाद, मैं उस आदमी पृष्ठ पर एक लाख बार पहले ही जा चुका हूँ। सौभाग्य से बुरा टैग कहीं भी प्रकाशित नहीं किया गया है। यहां तक ​​कि अगर यह था, तो यह एक आंतरिक परियोजना है और मैं केवल डेवलपर हूं (फिलहाल)। मुझे लगता है कि मैं तारिंग और पंख दोनों से काफी सुरक्षित हूं, लेकिन केवल अगर मैं डॉक्स से मिलान करने के लिए रेपो प्राप्त कर सकता हूं।
ब्रैंडन फॉसडिक

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

7
गरीब का जवाब। "यह मत करो" "मैं यह कैसे कर सकता हूं?" का सही उत्तर नहीं है। उपयोगकर्ता यह नहीं पूछ रहा था कि क्या आपको लगता है कि ऐसा करना एक अच्छा विचार है या यदि लोग इसे पसंद करेंगे। अगर कोई पूछता है कि "मैं अपना हाथ कैसे काट सकता हूं", या तो उसे बताएं कि यह कैसे किया गया है या उसे अकेला छोड़ दें लेकिन उसे किसी को यह बताने की आवश्यकता नहीं होगी कि हाथ काटना इतना अच्छा विचार नहीं हो सकता है। और आप कर सकते हैं। आप एक नया टैग जोड़ सकते हैं और पुराने को हटा सकते हैं, यह तकनीकी रूप से संभव है, यहां तक ​​कि एक दूरस्थ भंडार में भी।
मैकी

5
यह प्रश्न का उत्तर देने के लिए लगता है "मैं एक मौजूदा टैग बिंदु को एक अलग संशोधन कैसे कर सकता हूं?" ओपी के सवाल के बजाय, "मैं एक टैग का नाम कैसे बदलूं?" यह भी स्पष्ट नहीं है कि जिन लोगों को आपने गड़बड़ किया है, वे समस्या को हल करने जा रहे हैं (भले ही यह सामान्य रूप से एक अच्छा विचार है)।
लार्श

25

इस विकी पेज में यह दिलचस्प एक-लाइनर है, जो हमें याद दिलाता है कि हम कई रेफरी को धक्का दे सकते हैं :

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

और अन्य क्लोनर्स को करने के लिए कहें git pull --prune --tags

तो विचार धक्का है:

  • <new-tag>द्वारा संदर्भित हर प्रतिबद्ध के लिए <old-tag>: <refs/tags/old-tag>:<refs/tags/new-tag>,
  • का विलोपन<old-tag> ::<refs/tags/old-tag>

एक उदाहरण के रूप में देखें " एक गिट रिपॉजिटरी के अंदर टैग का नाम बदलना कन्वेंशन? "।


क्या यह एनोटेशन को संरक्षित करता है?
ब्रैंडन फॉस्सिक

1
खबरदार कि यह एनोटेट टैग के लिए एनोटेशन में मूल टैग नाम छोड़ देता है !! मुझे यकीन नहीं है कि अगर वास्तव में कुछ भी निकलता है, तो कम से कम वर्तमान संस्करणों में।
gbr

@gbr आप एनोटेशन में छोड़े गए "मूल टैग नाम" को दिखाते हुए एक उदाहरण के साथ उत्तर को संपादित कर सकते हैं?
VonC

1
@VonC मुझे यकीन नहीं है कि मैं समझता हूँ कि तुम क्या पूछ रहे हो; शायद मैं स्पष्ट नहीं था: एनोटेशन ऑब्जेक्ट में एक टैग फ़ील्ड होती है जो टैग के नाम पर सेट होती है, आप इसे देख सकते हैं git cat-file -p <tag>; अपने सिस्टम पर आपके सिस्टम के साथ मुझे 'नाम बदला' टैग रेफरी ( <new-tag>) मिलता है, लेकिन इसका टैग फील्ड अभी भी है <old-tag>
gbr

3
@ ओबरा क्या ओपी नहीं चाहता था? उन्होंने उल्लेख किया "मुझे यह इंगित करना चाहिए कि मैं इस जादुई टैग का नाम बदलने की प्रक्रिया का भी नाम बदला जा रहा टैग से एनोटेशन को संरक्षित करना चाहता हूं। वास्तव में, मैं वास्तव में सिर्फ नाम बदलना चाहूंगा और कुछ नहीं" ( stackoverflow.com/questions/1028969/) how-do-you-rename-a-git-tag /… )
VONC

25

अन्य उत्तरों के लिए एक ऐड के रूप में, मैंने एक और स्टेप में एक और परिचित * nix चाल कमांड फील के साथ यह सब करने के लिए एक उपनाम जोड़ा। तर्क 1 पुराना टैग नाम है, तर्क 2 नया टैग नाम है।

[alias]
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

उपयोग:

git renametag old new

यह मेरे लिए काम नहीं करता था, क्योंकि यह !sh(विंडोज गिट के बारे में सवाल था) में विफल रहा , हालांकि, प्रारूप को निम्नलिखित में अपडेट करने के बाद, इसने काम किया renametag = "!f() { git tag $2 $1; git tag -d $1; git push origin :refs/tags/$1; git push --tags; }; f":।
सनी पटेल

10

एक या कुछ टैग के लिए 3 चरण दृष्टिकोण का पालन करें।

चरण 1: वर्तमान टैग की ओर इशारा करते हुए कमिट / कमिट आईडी की पहचान करें

     command: git rev-parse <tag name>
     example: git rev-parse v0.1.0-Demo
     example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

चरण 2: टैग को रिपॉजिटरी से हटाएं

     command: git tag -d <tag name>
     example: git tag -d v0.1.0-Demo
     example output: Deleted tag 'v0.1.0-Demo' (was abcde)

चरण 3: पुराने टैग की ओर इशारा करते हुए उसी प्रतिबद्ध आईडी की ओर इशारा करते हुए एक नया टैग बनाएं

     command: git tag -a <tag name>  -m "appropriate message" <commit id>
     example: git tag -a v0.1.0-full  -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
     example output: Nothing or basically <No error>

एक बार स्थानीय git टैग नाम परिवर्तन के साथ तैयार हो जाने के बाद, इन परिवर्तनों को अन्य लोगों के लिए इन्हें लेने के लिए वापस मूल में धकेल दिया जा सकता है।


हटाए गए टैग git push origin :refs/tags/v0.1.0-Demoको पीछे धकेलने के लिए और पीछे के टैग (अन्य लंबित चीजों के साथ) को पुश करने के लिए यह कदम याद आ रहा हैgit push --tags
स्टार वुल्फ

6

साहसी के लिए यह एक कमांड में किया जा सकता है:

mv .git/refs/tags/OLD .git/refs/tags/NEW

7
यदि आपका refs भरे होते हैं यानी काम नहीं करेगा, यदि आप चलाते हैं git gcहाल ही में
forivall

2
यह भी केवल स्थानीय रेपो को प्रभावित करेगा। यदि आपके पास एक दूरस्थ कॉन्फ़िगर किया गया है, तो मुझे यकीन नहीं है कि यह क्या नकारात्मक प्रभाव पैदा कर सकता है। मैं इस दृष्टिकोण की सिफारिश नहीं करता हूं।
थेरैक्लेंनी

1
ध्यान दें कि एनोटेट टैग के लिए यह संभवतः और भी अधिक परेशानी भरा होगा, क्योंकि अन्य चीजों के बीच 'एनोटेशन' बूँद में टैग का मूल नाम होता है। वास्तव में मुझे यकीन नहीं है कि अगर इसका इस्तेमाल किया जाता है (उम्मीद है कि कम से कम सत्यापन-टैग द्वारा), लेकिन मैं मौका नहीं लूंगा।
gbr

1
@gbr यह ठीक काम करता है। (ज़ाहिर है, @forivall द्वारा नोट को ध्यान में रखा जाना है।) इस चाल को बड़े पैमाने पर ALT Sisyphus बिल्ड सिस्टम में उम्र के लिए इस्तेमाल किया गया है। देखें कि पैकेज के स्रोत कैसे संग्रहीत किए जाते हैं, जैसे: git.altlinux.org/gears/g/gear.git2.0.7-alt1 जैसे पठनीय टैग अनुरक्षकों द्वारा बिल्ड सिस्टम को सबमिट किए गए टैग हैं। गुप्त स्रोत gb-sisyphus-task164472.200 को निर्माण प्रणाली द्वारा टास्क आईडी को ट्रैक करने के लिए रखा गया है जिसने इस स्रोत से pkg का निर्माण और प्रकाशन किया है। वे मूक प्रतियां हैं ( cp), अनुचर संदेश के साथ अछूता।
imz - इवान ज़खरीशेव

@ imz - IvanZakharyaschev यह जानने के लिए अच्छा है, मैं बहुत अधिक भरोसा नहीं करूंगा, हालांकि यह भविष्य में समस्याओं को जन्म नहीं देगा, कुछ उत्पाद के साथ; git रिपॉजिटरी प्रारूप और अपेक्षित इंटरैक्शन का कोई वास्तविक विनिर्देश नहीं है, इसलिए जब यह व्यवहार्य होता है तो मैं चीजों को कम से कम आश्चर्यजनक तरीके से साफ करने का प्रयास करूंगा
gbr

3

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

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

फिर, आपको पुराने टैग को हटाने की जरूरत है:

git tag -d old_tag

मुझे यह कमांड लाइन निम्नलिखित दो उत्तरों के लिए धन्यवाद मिली:

संपादित करें:
टैग सेटिंग के स्वचालित सिंक्रनाइज़ेशन का उपयोग करके समस्याओं का सामना करना पड़ा fetch.pruneTags=true(जैसा कि https://stackoverflow.com/a/49215190/7009806 में वर्णित है ), मैं व्यक्तिगत रूप से पहले सर्वर पर नए टैग को कॉपी करने और फिर पुराने को हटाने का सुझाव देता हूं । इस तरह, पुराने टैग को हटाने पर नए टैग को बेतरतीब ढंग से हटाया नहीं जाता है और टैग का एक सिंक्रनाइज़ेशन नए टैग को हटाना चाहता है जो अभी तक सर्वर पर नहीं है । इसलिए, उदाहरण के लिए, हम सब मिलकर:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag

3

आप पुराने टैग / शाखा को नए नाम से डुप्लिकेट करके और पुराने को हटाकर, एक एकल git pushकमांड में, बिना उनकी जाँच किए, दूरस्थ टैग का नाम बदल सकते हैं ।

रिमोट टैग का नाम बदलें / रिमोट शाखा → टैग रूपांतरण: (नोटिस: :refs/tags/)

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

रिमोट शाखा का नाम बदलें / रिमोट टैग → शाखा रूपांतरण: (नोटिस: :refs/heads/)

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

एक दूरस्थ टैग का नामकरण आउटपुट:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.