मैं मौजूदा टैग संदेश को git में कैसे संपादित करूं?


225

हमारे पास हमारे गिट रिपॉजिटरी में कई एनोटेट टैग हैं। पुराने टैग्स में फर्जी संदेश हैं जिन्हें हम अपनी नई शैली में होना चाहते हैं।

% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.

इस उदाहरण में, हम v2.0 संदेश की तरह v1.x संदेश बनाना चाहते हैं। किसी को पता है कि हम यह कैसे करेंगे?


2
नोट: Git 2.17 (Q2 2018) के साथ, एक सरल git tag -m "A message" --edit v1.0पर्याप्त होगा। देखें नीचे मेरा उत्तर
VonC


@VonC ने इसे आज़माया और fatal: tag 'v6.6.2' already existsउपयोग कर प्राप्त किया 2.17.0
जोश हब्दास

1
आप हमेशा पिछला टैग हटा सकते हैं और इसे फिर से कर सकते हैं।
रोडरनर

जवाबों:


264

git tag <tag name> <tag name>^{} -f -m "<new message>"

यह एक ही नाम (मूल को अधिलेखित करके) के साथ एक नया टैग बनाएगा।


7
क्या यह मूल टैग की तारीख को बनाए रखता है?
जेम्स एम। ग्रीन ने

16
मेरी खुद की टिप्पणी के सवाल का जवाब: हाँ, यह तारीख को बदलता है। :(
जेम्स एम। ग्रीन

10
में "बैकडैटिंग टैग" अनुभाग देखें git tag --help
dahlbyk

6
यह भी ध्यान दिया जाना चाहिए कि आप कई संदेशों को जोड़ सकते हैं (वे एक नई पंक्ति से अलग हो जाते हैं - GitHub पर)git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
ब्लेयर मैकमिलन

5
@ChrisMorley, नीचे दिए गए मेरे जवाब को देखती है stackoverflow.com/a/23532519/603949 - संक्षेप में, <tag name>^{}जब आप बदलना चाहते हैंold tag
Sungam

87

एक जटिल संदेश को अपडेट करने के लिए, केवल एनोटेट टैग विकल्प के साथ -aया हस्ताक्षरित टैग विकल्प के साथ निर्दिष्ट करें -s:

git tag <tag name> <tag name>^{} -f -a

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


39

git tag <tag name> <tag name>^{} -f -a

यह एक सुधार है: इसके बिना ^{}यह एक नई टैग ऑब्जेक्ट बनाएगा जो पुराने टैग ऑब्जेक्ट को संदर्भित करता है, जहां दोनों का टैग नाम समान होगा।

<tag name>^{} टैग / संदर्भ को हल करेगा जब तक कि यह पहली प्रतिबद्ध हैश न पाए।


4
@BrentFoust, यह तभी काम करता है जब आपका सिर टैग की गई प्रतिबद्ध पर हो usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
सुंगम

33

टी एल; डॉ

आप अपना टैग हटाकर और दिनांक और लेखक को स्पूफ करते हुए इसे फिर से बना सकते हैं:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

पूरी कहानी:

सनग्राम के उत्तर पर निर्माण (मूल रूप से एक संपादन के रूप में प्रस्तावित):

1. स्वीकृत उत्तर

यह एंडी और एरिक हू पर सुधार है के उत्तरों है। उनके जवाब एक नई टैग ऑब्जेक्ट बनाएंगे जो पुराने टैग ऑब्जेक्ट को संदर्भित करता है और दोनों का एक ही नाम होने वाला है।

इसे समझने के लिए, निम्नलिखित पर विचार करें:

> git tag tag1 tag1 -f -a  # accepted answer
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
260ab7928d986472895b8c55e54569b3f3cb9517 tag1
a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Original description]

[tagged commit details]

2. सनग्राम का सुधार

<tag name>^{}के दूसरे तर्क के रूप में उपयोग करनाgit tagवसीयत करने के बजाय एक ही नाम के साथ पिछले सभी टैग हटा दें।

पिछले टर्मिनल सत्र की निरंतरता पर विचार करें:

> git tag tag1 tag1^{} -f -a  # suggested improvement
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

[tagged commit details]

3. दिनांक सहेजें

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

> GIT_COMMITTER_DATE="$(git show tag1 |                              # get info about the tag cascade including the date original of the original tag
> awk '{
>     if ($1 == "Date:") {
>         print substr($0, index($0,$3))
>     }
> }' |                                                               # extract all the dates from the info
> tail -2 | head -1)"                                               `# get the second to last date, as the last one is the commit date` \
> git tag tag1 tag1^{} -a -f                                         # finally, update the tag message, but save the date of the old one
>
> git rev-list --objects -g --no-walk --all
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
e18c178f2a548b37799b100ab90ca785af1fede0 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17
> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Updated description]

[tagged commit details]

संदर्भ:

4. DIY

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

आप इसे जारी करके प्राप्त कर सकते हैं:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

यहाँ [optional]एक वैकल्पिक क्षेत्र है; <required>एक आवश्यक क्षेत्र है। बेशक, आप git tagकमांड के बाद किसी भी झंडे को जोड़ सकते हैं जो आप सामान्य रूप से करेंगे।


3
यह इंगित करने के लिए धन्यवाद कि "उनके उत्तर एक नई टैग ऑब्जेक्ट बनाएंगे"!
cwhsu

The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
कोटिंग

11

@ और समाधान

git tag <tag-name> <tag-name> -f -a

है गलत । इसके बाद, साथ

git show

कमांड, हम एक ही नाम के साथ स्टैक टैग देखेंगे।

यह एक ही टैग नाम के साथ एक नया टैग और प्रतिबद्ध में नया संदेश जोड़ता है <tag-name>। लेकिन यह पुराने टैग को नहीं हटाता है। यह इस आदेश का एक विशेष मामला है:

git tag [<commit> | <old-tag>] <tag-name>

लेकिन बस <old-tag>साथ ही है <tag-name>


सही समाधान सरल है, बस अद्यतन टैग ठीक है।

git tag <tag-name> -f -a

याद रखें, यहाँ केवल एक है।

यदि हम परिवर्तन टैग चाहते हैं, जो नहीं है HEAD, तो हमें एक अतिरिक्त <commit>तर्क की आवश्यकता है।

git tag <commit> <tag-name> -f -a

हाँ! आप सही हे। इशारा करने के लिए धन्यवाद। टैग को फिर से लिखने के बाद, कुछ बार एनोटेट किया गया, मैं अपने टैग की जाँच कर रहा था git show <tag>और मुझे पिछले सभी संस्करण दिखाई दे रहे हैं।
मानोएल विलेला

समस्या यह है: अगर मुझे कुछ टैग को अपडेट करने की आवश्यकता है HEAD, जो अतिरिक्त नहीं है <commit>, तो खोले गए टैग खाली है। मुझे उम्मीद है कि पुराने टैग को सिर्फ संपादित किया जाएगा। क्या कोई रास्ता है?
मनोएल विलेला

कृपया ध्यान दें कि आपने जवाब देने के बाद से एंडी का समाधान अपडेट किया गया है। शायद एक संदेश के साथ अपना जवाब शुरू करना अच्छा होगा, यह कहते हुए कि यह तय हो गया है? यह भी हो सकता है कि आपके आदेश git tag <commit> <tag-name> -f -aमें <प्रतिबद्ध> और <टैग-नाम> उलट हो? यह इस तरह दिखता है जब अन्य उत्तरों और डॉक्स के साथ तुलना की जाती है, लेकिन मैं कोई विशेषज्ञ नहीं हूं।
जैकब अककरबोम

7

हम v1.x संदेशों को v2.0 संदेश की तरह बनाना चाहते हैं

Git 2.17 (Q2 2018) के साथ , एक नया टैग बनाने के लिए एक विकल्प होगा git tag <tag name> <tag name> -f -m "<new message>", क्योंकि " git tag" एक स्पष्ट " --edit" विकल्प सीखा है जो -m"और" के माध्यम से दिए गए संदेश -Fको और संपादित करने की अनुमति देता है ।

निकोलस मोरे-चिसमार्टिन ( ) द्वारा प्रतिबद्ध 9eed6e4 (06 फरवरी 2018) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 05d290e , 06 मार्च 2018)nmorey
gitster

tag: --editविकल्प जोड़ें

एक जोड़े --editजो द्वारा प्रदान संदेशों को संशोधित करने की अनुमति देता है विकल्प -mया -F, उसी तरह git commit --editसे करता है।


4
क्या आप --editओपी को संबोधित करते हुए एक सुसंगत उदाहरण प्रदान कर सकते हैं ?
जोश हब्दास

@ जोशदास वास्तव में, आपको -f विकल्प जोड़ने की आवश्यकता है: --edit केवल संदेश को और संपादित करने की अनुमति देता है।
VonC

धन्यवाद। तो अगर -fझंडा भी जोड़ा जाता है तो --editसंदेश को संपादित करेगा और टाइमस्टैम्प को संशोधित करेगा, है ना?
जोश हबदास

@ जोशदास यह विचार है, हाँ।
VONC

4

आपको -fबल के झंडे का उपयोग करके फिर से टैग करना होगा ।

git tag v1.0 -f -m "actual message"

3
यह समाधान मानता है कि वर्तमान गिट सिर संस्करण 1.0 पर है। यह चीजों को गड़बड़ कर सकता है अगर यह नहीं है, क्योंकि यह संस्करण 1.0 से संबंधित संशोधन को बदलता है। एंडी का समाधान इस नुकसान से बचा जाता है।
एरिक ओ लेबिगोट

4

उपरोक्त उत्तरों का उपयोग करते हुए, यह मेरा उपनाम वन-लाइनर है .gitconfig। मौजूदा टैग को प्रतिस्थापित करता है और प्रतिबद्ध दिनांक को संरक्षित करता है।

[alias]
    tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '"

सुधार?


1
लेखक को भी रखता है: tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
पूर्वकाल

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

0

आप की तरह एक GUI का उपयोग कर रहे हैं, तो smartgit बस

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