Wie bearbeite ich eine vorhandene Tag-Nachricht in Git?

Lesezeit: 10 Minuten

Wie bearbeite ich eine vorhandene Tag Nachricht in Git
jared

Wir haben mehrere annotierte Tags in unserem Git-Repository. Die älteren Tags enthalten falsche Nachrichten, die wir aktualisieren möchten, damit sie in unserem neuen Stil erscheinen.

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

In diesem Beispiel möchten wir, dass v1.x-Nachrichten wie die v2.0-Nachrichten aussehen. Wie würden wir das machen?

  • Hinweis: Mit Git 2.17 (Q2 2018) ist eine einfache git tag -m "A message" --edit v1.0 wäre genug. Siehe meine Antwort unten

    – VonC

    10. März 2018 um 23:40 Uhr

  • Verwandte: Wie benennt man ein Git-Tag um?

    – Stevoisiak

    16. März 2018 um 19:10 Uhr

  • @VonC Versucht und erhalten fatal: tag 'v6.6.2' already exists verwenden 2.17.0.

    – vhs

    26. August 2018 um 9:58 Uhr


  • Sie können jederzeit das vorherige Tag löschen und es erneut tun.

    – RoadRunner

    2. Dezember 2018 um 5:25 Uhr

Wie bearbeite ich eine vorhandene Tag Nachricht in Git
Andy

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

Dadurch wird ein neues Tag mit demselben Namen erstellt (indem das Original überschrieben wird).

  • Behält dies das Datum des ursprünglichen Tags bei?

    – James M. Greene

    22. Mai 2013 um 16:06 Uhr

  • Antwort auf meine eigene Kommentarfrage: Ja, es tut ändere das Datum. 🙁

    – James M. Greene

    22. Mai 2013 um 16:18 Uhr

  • Siehe den Abschnitt „Zur Rückdatierung von Tags“ in git tag --help.

    – dahlbyk

    22. Mai 2013 um 16:20 Uhr

  • Es sollte auch beachtet werden, dass Sie auch mehrere Nachrichten anhängen können (sie werden durch eine neue Zeile getrennt – auf GitHub). git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"

    – Blair McMillan

    12. Februar 2014 um 0:07 Uhr

  • @ChrisMorley sieht sich meine Antwort unter stackoverflow.com/a/23532519/603949 an – kurz gesagt, verwenden <tag name>^{} wenn Sie die ersetzen möchten old tag

    – Sungam

    23. August 2014 um 11:24 Uhr


1646247489 472 Wie bearbeite ich eine vorhandene Tag Nachricht in Git
Erich Hu

Um eine komplexe Nachricht zu aktualisieren, geben Sie einfach die kommentierte Tag-Option mit an -a oder die signierte Tag-Option mit -s:

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

Dies öffnet einen Editor mit dem Inhalt Ihrer alten Tag-Nachricht.

  • Die <tag name>^{} das Ding hat bei mir nicht funktioniert. Nach einigem Suchen habe ich das festgestellt das ist eine Windows-Sache: cmd.exe Verwendet ^ als Shell-Flucht, also müssen Sie es verdoppeln.

    – Karl Knechtel

    13. August 2020 um 16:13 Uhr

  • Bitte beachten Sie, dass die Idee von ^{} bearbeitet von John Kugelman stammt im Grunde aus Sungams Antwort.

    – Trilarion

    29. Mai 2021 um 12:12 Uhr


1646247490 408 Wie bearbeite ich eine vorhandene Tag Nachricht in Git
Sungam

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

Das ist eine Verbesserung: ohne ^{} Es wird ein neues Tag-Objekt erstellt, das auf das alte Tag-Objekt verweist, wobei beide den gleichen Tag-Namen haben.

<tag name>^{} wird das Tag/die Referenz auflösen, bis es den ersten Commit-Hash findet.

  • @BrentFoust, das funktioniert nur, wenn Ihr Kopf beim markierten Commit ist usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]

    – Sungam

    9. Oktober 2014 um 0:47 Uhr


  • Die <tag name>^{} das Ding hat bei mir nicht funktioniert. Nach einigem Suchen habe ich das festgestellt das ist eine Windows-Sache: cmd.exe Verwendet ^ als Shell-Flucht, also müssen Sie es verdoppeln.

    – Karl Knechtel

    13. August 2020 um 16:13 Uhr

1646247490 207 Wie bearbeite ich eine vorhandene Tag Nachricht in Git
Stamm

TL;DR

Sie können dies tun, indem Sie Ihr Tag löschen und neu erstellen, während Sie das Datum und den Autor fälschen:

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

Ganze Geschichte:

Aufbauend auf Sungrams Antwort (ursprünglich als Bearbeitung vorgeschlagen):

1. Akzeptierte Antwort

Dies ist eine Verbesserung gegenüber den Antworten von Andy und Eric Hu. Ihre Antworten erstellen ein neues Tag-Objekt, das auf das alte Tag-Objekt verweist, und beide werden denselben Namen haben.

Um dies zu veranschaulichen, bedenken Sie Folgendes:

> 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:   2024
[Updated description]

tag tag1
Tagger: [tagger]
Date:   2024
[Original description]

[tagged commit details]

2. Sungrams Verbesserung

Verwenden <tag name>^{} als zweites Argument von git tag löscht stattdessen alle vorherigen Tags mit demselben Namen.

Betrachten Sie die Fortsetzung der vorherigen Terminalsitzung:

> 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:   2024
[Updated description]

[tagged commit details]

3. Speichern Sie das Datum

Wenn Sie schließlich das Datum des ursprünglichen Tags als Datum des aktualisierten Tags beibehalten möchten, verwenden Sie etwas awk (oder ähnliche) Magie oder fügen Sie stattdessen einfach das gewünschte Datum ein. Das Folgende ist ein Ersatz für das zweite Beispiel (sonst würde das ursprüngliche Datum durch Überschreiben verloren gehen):

> 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:   2024
[Updated description]

[tagged commit details]

Verweise:

  • SO: Schnelles Auflisten von Objekten in der Git-Datenbank

  • SO: Ändern Sie das Committer-Datum eines Git-Tags

  • Awk: Ein Tutorial und eine Einführung

  • SO: Filtern Sie die Ausgabe nach dem ersten Token der Zeile und extrahieren Sie den Rest der Zeile mit awk

  • SO: So fügen Sie einen Bash-Zeilenkommentar in einen mehrzeiligen Befehl ein

4. Heimwerken

Alternativ zum Aktualisieren der Tags können Sie diese auch einfach löschen und erneut erstellen. Wie sich herausstellt, fügt die Aktualisierung einfach ein neues Tag hinzu und lässt es auf das alte verweisen, oder alternativ löscht es einfach implizit das alte und erstellt trotzdem ein neues, das auf denselben Commit verweist.

Sie können dies erreichen, indem Sie Folgendes ausgeben:

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

Hier [optional] ist ein optionales Feld; <required> Ist ein Pflichtfeld. Natürlich können Sie nach dem beliebige Flags hinzufügen git tag Befehl, den Sie normalerweise tun würden.

1646247490 605 Wie bearbeite ich eine vorhandene Tag Nachricht in Git
liuyang1

@Andys Lösung wie 2016 vorhanden

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

ist falsch. Danach mit

git show

Befehl, sehen wir Stack-Tags mit demselben Namen.

Beim Commit wird ein neues Tag mit demselben Tag-Namen und einer neuen Nachricht hinzugefügt <tag-name>. Aber es entfernt nicht das alte Tag. Es ist ein Sonderfall dieses Befehls:

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

Aber eben <old-tag> ist gleich mit <tag-name>.


Die richtige Lösung ist einfach, nur das Tag aktualisieren ist in Ordnung.

git tag <tag-name> -f -a

Denken Sie daran, nur EIN Hier.

Wenn wir Tag ändern wollen, was nicht ist HEADwir brauchen eine zusätzliche <commit> Streit.

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

  • JAWOHL! Du hast recht. Danke für den Hinweis. Nachdem ich das annotierte Tag einige Male neu geschrieben hatte, wurde mein Tag mit überprüft git show <tag> und ich sehe alle vorherigen Ausgaben.

    – Manoël Vilela

    29. Juli 2017 um 18:11 Uhr

  • Das Problem ist: Wenn ich ein Tag aktualisieren muss, das es nicht ist HEADdas Extra übergeben <commit>, das geöffnete Tag ist leer. Ich habe erwartet, dass das alte Tag nur bearbeitet wird. Gibt es einen Weg?

    – Manoël Vilela

    29. Juli 2017 um 18:32 Uhr

  • Bitte beachten Sie, dass Andys Lösung seit Ihrer Antwort aktualisiert wurde. Vielleicht wäre es nett, Ihre Antwort mit einer Nachricht zu beginnen, die besagt, dass es behoben wurde? Könnte es auch sein, dass Ihr Befehl git tag <commit> <tag-name> -f -a hat und vertauscht? Im Vergleich zu anderen Antworten und den Dokumenten sieht es so aus, aber ich bin kein Experte.

    – Jakob Akkerboom

    26. Juli 2019 um 14:07 Uhr

  • Ich habe das gleiche OP-Problem, brauche aber etwas Vollständigkeit. Ok, ich habe ein altes Commit, dessen Hash-Tag Unterschiede zeigt, wenn es mit seinem Hash verglichen wird (seltsam, aber wahr), also checke ich zu dem anstößigen Commit aus, das mir die Meldung „Sie befinden sich im getrennten HEAD“ zeigt, lösche das alte Tag und erstellt das neue mit demselben Namen … Nun, wie schiebe ich diesen Fix in das Repo, da es sich nicht um einen neuen Commit handelt? Dieser letzte “Push” ist das, was ich in keiner der hervorragenden Antworten, die ich gelesen habe, kommentiert sehe.

    – Fer B.

    12. August 2021 um 9:02 Uhr

Wir möchten, dass v1.x-Nachrichten wie die v2.0-Nachrichten aussehen

Mit Git 2.17 (Q2 2018) wird es eine Alternative zum Erstellen einer Neu tag mit git tag <tag name> <tag name> -f -m "<new message>"seit “git tag„lernte ein explizit “--edit” Möglichkeit das ermöglicht die Nachricht, die über “-m” und “-F„weiter bearbeitet werden.

Sehen Commit 9eed6e4 (06.02.2018) von Nicolas Morey-Chaisemartin (nmorey).
(Zusammengeführt von Junio ​​C. Hamano — gitster in begehen 05d290e06.03.2018)

tag: addieren --edit Möglichkeit

Füge hinzu ein --edit Option, mit der die von bereitgestellten Nachrichten geändert werden können -m oder -Fin der gleichen Weise git commit --edit tut.

  • JAWOHL! Du hast recht. Danke für den Hinweis. Nachdem ich das annotierte Tag einige Male neu geschrieben hatte, wurde mein Tag mit überprüft git show <tag> und ich sehe alle vorherigen Ausgaben.

    – Manoël Vilela

    29. Juli 2017 um 18:11 Uhr

  • Das Problem ist: Wenn ich ein Tag aktualisieren muss, das es nicht ist HEADdas Extra übergeben <commit>, das geöffnete Tag ist leer. Ich habe erwartet, dass das alte Tag nur bearbeitet wird. Gibt es einen Weg?

    – Manoël Vilela

    29. Juli 2017 um 18:32 Uhr

  • Bitte beachten Sie, dass Andys Lösung seit Ihrer Antwort aktualisiert wurde. Vielleicht wäre es nett, Ihre Antwort mit einer Nachricht zu beginnen, die besagt, dass es behoben wurde? Könnte es auch sein, dass Ihr Befehl git tag <commit> <tag-name> -f -a hat und vertauscht? Im Vergleich zu anderen Antworten und den Dokumenten sieht es so aus, aber ich bin kein Experte.

    – Jakob Akkerboom

    26. Juli 2019 um 14:07 Uhr

  • Ich habe das gleiche OP-Problem, brauche aber etwas Vollständigkeit. Ok, ich habe ein altes Commit, dessen Hash-Tag Unterschiede zeigt, wenn es mit seinem Hash verglichen wird (seltsam, aber wahr), also checke ich zu dem anstößigen Commit aus, das mir die Meldung „Sie befinden sich im getrennten HEAD“ zeigt, lösche das alte Tag und erstellt das neue mit demselben Namen … Nun, wie schiebe ich diesen Fix in das Repo, da es sich nicht um einen neuen Commit handelt? Dieser letzte “Push” ist das, was ich in keiner der hervorragenden Antworten, die ich gelesen habe, kommentiert sehe.

    – Fer B.

    12. August 2021 um 9:02 Uhr

Sie müssen erneut taggen, indem Sie die verwenden -f Flagge erzwingen.

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

  • Diese Lösung setzt voraus, dass der aktuelle Git-Kopf die Version 1.0 hat. Dies kann die Dinge durcheinander bringen, wenn dies nicht der Fall ist, da es die mit Version 1.0 verknüpfte Revision ändert. Andys Lösung vermeidet diese Falle.

    – Eric O. Lebigot

    29. Mai 2012 um 9:28 Uhr

915130cookie-checkWie bearbeite ich eine vorhandene Tag-Nachricht in Git?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy