Wir haben mehrere kommentierte Tags in unserem Git-Repository. Die älteren Tags enthalten gefälschte Nachrichten, die wir aktualisieren möchten, um sie in unserem neuen Stil zu erhalten.
% 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-Nachricht aussehen. Weiß jemand, wie wir das machen würden?
git tag -m "A message" --edit v1.0
würde ein einfaches ausreichen. Siehe meine Antwort untenfatal: tag 'v6.6.2' already exists
mit2.17.0
.Antworten:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Dadurch wird ein neues Tag mit demselben Namen erstellt (indem das Original überschrieben wird).
quelle
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
Sie , wenn Sie dieold tag
Um eine komplexe Nachricht zu aktualisieren, geben Sie einfach die Option für kommentierte Tags mit
-a
oder die Option für signierte Tags mit an-s
:Dadurch wird ein Editor mit dem Inhalt Ihrer alten Tag-Nachricht geöffnet .
quelle
git tag <tag name> <tag name>^{} -f -a
Dies ist eine Verbesserung: Ohne
^{}
wird ein neues Tag-Objekt erstellt, 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 Commit-Hash gefunden wird.quelle
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Sie können dies tun, indem Sie Ihr Tag löschen und neu erstellen, während Sie Datum und Autor fälschen:
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 haben denselben Namen.
Betrachten Sie zur Veranschaulichung Folgendes:
2. Sungrams Verbesserung
Verwenden Sie stattdessen
<tag name>^{}
als zweites Argument vongit tag
will alle vorherigen Tags mit demselben Namen.Betrachten Sie die Fortsetzung der vorherigen Terminalsitzung:
3. Speichern Sie das Datum
Wenn Sie das Datum des ursprünglichen Tags als Datum des aktualisierten Tags beibehalten möchten, verwenden Sie eine 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 (andernfalls würde das ursprüngliche Datum durch Überschreiben verloren gehen):
Verweise:
SO: Schnelle Auflistung 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-Line-Kommentar in einen mehrzeiligen Befehl ein
4. DIY
Alternativ zum Aktualisieren der Tags können Sie sie einfach löschen und erneut erstellen. Wie sich herausstellt, fügt das Aktualisieren nur ein neues Tag hinzu und verweist auf das alte, oder löscht alternativ einfach implizit das alte und erstellt ein neues, das ohnehin auf dasselbe Commit verweist.
Sie können dies erreichen, indem Sie Folgendes ausgeben:
Hier
[optional]
ist ein optionales Feld;<required>
Ist ein Pflichtfeld. Natürlich können Sie nach demgit tag
Befehl beliebige Flags hinzufügen .quelle
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
@Andys Lösung
ist falsch . Danach mit
Befehl sehen wir Stapel-Tags mit dem gleichen Namen.
Beim Festschreiben wird ein neues Tag mit demselben Tag-Namen und derselben neuen Nachricht hinzugefügt
<tag-name>
. Das alte Tag wird jedoch nicht entfernt. Es ist ein Sonderfall dieses Befehls:Aber genauso
<old-tag>
ist es mit<tag-name>
.Die richtige Lösung ist einfach, nur das Update-Tag ist in Ordnung.
Denken Sie daran, nur EIN hier.
Wenn wir das Tag ändern möchten, was nicht der Fall ist
HEAD
, benötigen wir ein zusätzliches<commit>
Argument.quelle
git show <tag>
und sehe alle vorherigen Ausgaben.HEAD
ist<commit>
, ist das geöffnete Tag leer. Ich habe erwartet, dass das alte Tag nur bearbeitet wird. Gibt es einen Weg?git tag <commit> <tag-name> -f -a
<commit> und <tag-name> umgekehrt hat? Im Vergleich mit anderen Antworten und den Dokumenten sieht es so aus, aber ich bin kein Experte.Mit Git 2.17 (Q2 2018) gibt es eine Alternative zum Erstellen eines neuen Tags mit
git tag <tag name> <tag name> -f -m "<new message>"
, da "git tag
" eine explizite "--edit
" Option gelernt wurde , mit der die über "-m
" und "-F
" übermittelte Nachricht weiter bearbeitet werden kann.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)Fügen Sie eine
--edit
Option hinzu, mit der Sie die von-m
oder bereitgestellten Nachrichten auf-F
die gleiche Weisegit commit --edit
ändern können.quelle
--edit
das sich an das OP richtet?-f
Flag hinzugefügt--edit
wird, wird die Nachricht bearbeitet und der Zeitstempel geändert, oder?Sie müssen erneut mit dem
-f
Force-Flag markieren .quelle
Mit den obigen Antworten ist dies mein Alias Einzeiler für
.gitconfig
. Ersetzt das vorhandene Tag und behält das Festschreibungsdatum bei.Verbesserungen?
quelle
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 '"
Wenn Sie eine GUI wie verwenden SmartGit nur
quelle