W naszym repozytorium git mamy kilka tagów z adnotacjami. Starsze tagi zawierają fałszywe wiadomości, które chcielibyśmy zaktualizować, aby były w naszym nowym stylu.
% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.
W tym przykładzie chcielibyśmy, aby komunikaty w wersji 1.x wyglądały jak komunikaty w wersji 2.0. Czy ktoś wie, jak byśmy to zrobili?
git tag -m "A message" --edit v1.0
. Zobacz moją odpowiedź poniżejfatal: tag 'v6.6.2' already exists
używając2.17.0
.Odpowiedzi:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Spowoduje to utworzenie nowego znacznika o tej samej nazwie (poprzez zastąpienie oryginału).
źródło
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
gdy chcesz zastąpićold tag
Aby zaktualizować złożoną wiadomość, wystarczy określić opcję znacznika z adnotacją za pomocą
-a
lub opcję znacznika z podpisem-s
:Spowoduje to otwarcie edytora z zawartością starej wiadomości tagu .
źródło
git tag <tag name> <tag name>^{} -f -a
To jest ulepszenie: bez
^{}
niego utworzy nowy obiekt znacznika, który będzie odwoływał się do starego obiektu znacznika, gdzie oba będą miały tę samą nazwę znacznika.<tag name>^{}
rozwiąże tag / referencję, dopóki nie znajdzie pierwszego skrótu zatwierdzenia.źródło
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Możesz to zrobić, usuwając tag i odtwarzając go ponownie, fałszując datę i autora:
Cała historia:
Opierając się na odpowiedzi Sungram (pierwotnie zaproponowanej jako edycja):
1. Zaakceptowana odpowiedź
To poprawa w stosunku do odpowiedzi Andy'ego i Erica Hu . Ich odpowiedzi utworzą nowy obiekt znacznika, który odwołuje się do starego obiektu znacznika i oba będą miały tę samą nazwę.
Aby to zilustrować, rozważ następujące kwestie:
2. Poprawa Sungram
Użycie
<tag name>^{}
jako drugiego argumentugit tag
spowoduje usunięcie wszystkich poprzednich znaczników o tej samej nazwie.Rozważ kontynuację poprzedniej sesji terminalowej:
3. Zapisz datę
Na koniec, jeśli chcesz zachować datę oryginalnego tagu jako datę zaktualizowanego tagu, użyj magii awk (lub podobnej) lub po prostu wklej datę, którą chcesz. Poniższy przykład zastępuje drugi przykład (w przeciwnym razie pierwotna data zostałaby utracona z powodu zastąpienia ):
Bibliografia:
SO: Szybka lista obiektów w bazie danych git
SO: Zmień datę zatwierdzenia tagu git
Awk: samouczek i wprowadzenie
SO: Filtruj dane wyjściowe według pierwszego tokena linii i wyodrębnij resztę linii za pomocą awk
SO: Jak umieścić komentarz linii bash w poleceniu wieloliniowym
4. DIY
Alternatywnie do aktualizacji tagów, możesz je po prostu usunąć i utworzyć ponownie. Jak się okazuje, aktualizacja po prostu dodaje nowy tag i sprawia, że wskazuje on na stary, lub, alternatywnie, po prostu domyślnie usuwa stary i tworzy nowy, aby wskazywać na to samo zatwierdzenie.
Możesz to osiągnąć, wydając:
Oto
[optional]
pole opcjonalne;<required>
jest polem wymaganym. Oczywiście pogit tag
poleceniu możesz dodać dowolne flagi .źródło
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
Rozwiązanie @Andy
jest źle . Po tym, z
polecenie, zobaczymy tagi stosu o tej samej nazwie.
Dodaje nowy tag o tej samej nazwie i nową wiadomość przy zatwierdzeniu
<tag-name>
. Ale to nie usuwa starej etykiety. Jest to szczególny przypadek tego polecenia:Ale tak
<old-tag>
samo jest z<tag-name>
.Prawidłowe rozwiązanie jest proste, wystarczy zaktualizować tag, jest OK.
Pamiętaj, tylko JEDEN tutaj.
Jeśli chcemy zmienić tag, który nie jest
HEAD
, potrzebujemy dodatkowego<commit>
argumentu.źródło
git show <tag>
i widzę wszystkie poprzednie wydania.HEAD
, przekazanie dodatkowego<commit>
tagu jest pusty. Spodziewałem się, że stary tag po prostu będzie edytować. Czy jest jakiś sposób?git tag <commit> <tag-name> -f -a
<commit> i <tag-name> zostało odwrócone? Tak wygląda to w porównaniu z innymi odpowiedziami i dokumentami, ale nie jestem ekspertem.W Git 2.17 (Q2 2018) pojawi się alternatywa dla tworzenia nowego tagu
git tag <tag name> <tag name> -f -m "<new message>"
, ponieważ „git tag
” nauczył się wyraźnej--edit
opcji „ ”, która pozwala na dalszą edycję wiadomości podanej za pomocą „-m
” i „-F
”.Zobacz commit 9eed6e4 (06 lutego 2018) autor: Nicolas Morey-Chaisemartin (
nmorey
) .(Scalone przez Junio C Hamano -
gitster
- w commit 05d290e , 06 marca 2018)Dodaj
--edit
opcję, która pozwala modyfikować wiadomości dostarczane przez-m
lub-F
, w ten sam sposóbgit commit --edit
.źródło
--edit
który dotyczy OP?-f
flaga zostanie również dodana, wtedy--edit
edytuje wiadomość i modyfikuje znacznik czasu, prawda?Będziesz musiał ponownie oznaczyć tagiem, używając
-f
flagi siły.źródło
Korzystając z powyższych odpowiedzi, jest to mój alias one-liner dla
.gitconfig
. Zastępuje istniejący tag i zachowuje datę zatwierdzenia.Ulepszenia?
źródło
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 '"
Jeśli używasz GUI jak smartgit tylko
źródło