webentwicklung-frage-antwort-db.com.de

Wie bearbeite ich eine vorhandene Tag-Nachricht in Git?

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

% 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 v1.x-Nachrichten wie die v2.0-Nachricht aussehen lassen. Weiß jemand, wie wir das machen würden?

196
jared

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

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

226
Andy

Um eine komplexe Nachricht zu aktualisieren, geben Sie einfach die Option für das mit Anmerkungen versehene Tag mit -a Oder die Option für das signierte Tag mit -s An:

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

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

76
Eric Hu

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

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

<tag name>^{} löst das Tag/die Referenz auf, bis der erste Festschreibungs-Hash gefunden wird.

37
Sungam

TL; DR

Sie können dies tun, indem Sie Ihr Tag löschen und neu erstellen, während Sie Datum und 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 der Antwort von Sungram (ursprünglich als Bearbeitung vorgeschlagen):

1. Akzeptierte Antwort

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

Beachten Sie zur Veranschaulichung 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:   [date of updated tag]
[Updated description]

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

[tagged commit details]

2. Sungrams Verbesserung

Wenn Sie <tag name>^{} Als zweites Argument von git tag Verwenden, werden stattdessen alle vorherigen Tags mit demselben Namen gelöscht.

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:   [date of updated tag]
[Updated description]

[tagged commit details]

3. Speichern Sie das Datum

Wenn Sie das Datum des ursprünglichen Tags als das Datum des aktualisierten Tags beibehalten möchten, verwenden Sie zum Schluss etwas awk-Magie (oder ähnliches) oder fügen Sie stattdessen einfach das gewünschte Datum ein. Das Folgende ist ein Ersatz für das zweite Beispiel (ansonsten 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:   [date of original tag]
[Updated description]

[tagged commit details]

Verweise:

4. DIY

Alternativ zur Aktualisierung der Tags können Sie diese auch löschen und neu erstellen. Wie sich herausstellt, fügt das Aktualisieren lediglich ein neues Tag hinzu und weist auf das alte, oder es löscht implizit das alte und erstellt ein neues, um trotzdem auf dasselbe Commit zu verweisen.

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

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

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

30
stanm

@Andy's Lösung

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

ist falsch. Danach mit

git show

befehl sehen wir Stack-Tags mit dem gleichen Namen.

Bei commit <tag-name> Wird ein neues Tag mit demselben Tag-Namen und neuer Nachricht hinzugefügt. Das alte Tag wird jedoch nicht entfernt. Es ist ein Sonderfall dieses Befehls:

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

Aber nur <old-tag> Ist dasselbe mit <tag-name>.


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

git tag <tag-name> -f -a

Denken Sie daran, nur EIN hier.

Wenn wir ein Änderungs-Tag wollen, das nicht HEAD ist, brauchen wir ein zusätzliches Argument <commit>.

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

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

Mit Git 2.17 (Q2 2018) gibt es eine Alternative zum Erstellen eines new -Tags mit git tag <tag name> <tag name> -f -m "<new message>", Da "git tag" Ein explizite Option "--edit" , mit der die über "-m" und "-F" übermittelte Nachricht weitergeleitet werden kann bearbeitet.

Siehe commit 9eed6e4 (06. Februar 2018) von Nicolas Morey-Chaisemartin (nmorey .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Commit 05d290e , 06. März 2018)

tag: Option --edit hinzufügen

Fügen Sie eine --edit - Option hinzu, mit der Sie die von -m Oder -F Bereitgestellten Nachrichten auf die gleiche Weise ändern können wie mit git commit --edit.

5
VonC

Unter Verwendung der obigen Antworten ist dies mein Alias ​​Einzeiler für .gitconfig. Ersetzt das vorhandene Tag und behält das Festschreibungsdatum bei.

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

Verbesserungen?

4
h0tw1r3

Sie müssen erneut taggen, indem Sie -f Flag erzwingen.

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