Temos várias tags anotadas em nosso repositório git. As tags mais antigas têm mensagens falsas que gostaríamos de atualizar para estar em nosso novo estilo.
% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.
Neste exemplo, gostaríamos de fazer com que as mensagens v1.x se pareçam com a mensagem v2.0. Alguém sabe como faríamos isso?
git tag -m "A message" --edit v1.0
seria suficiente. Veja minha resposta abaixofatal: tag 'v6.6.2' already exists
usando2.17.0
.Respostas:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Isso criará uma nova tag com o mesmo nome (substituindo o original).
fonte
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
quando você deseja substituir oold tag
Para atualizar uma mensagem complexa, basta especificar a opção de marca anotada com
-a
ou a opção de marca assinada com-s
:Isso abrirá um editor com o conteúdo da sua mensagem de tag antiga .
fonte
git tag <tag name> <tag name>^{} -f -a
Isso é uma melhoria: sem
^{}
ele, será criado um novo objeto de tag que faz referência ao objeto de tag antigo, onde os dois terão o mesmo nome de tag.<tag name>^{}
resolverá a tag / referência até encontrar o primeiro hash de confirmação.fonte
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Você pode fazer isso excluindo sua tag e recriando-a enquanto falsifica a data e o autor:
Toda a história:
Com base na resposta da Sungram (originalmente proposta como uma edição):
1. Resposta Aceita
Esta é uma melhoria em relação às respostas de Andy e Eric Hu . Suas respostas criarão um novo objeto de tag que faz referência ao objeto de tag antigo e ambos terão o mesmo nome.
Para ilustrar isso, considere o seguinte:
2. Melhoria do Sungram
Usar
<tag name>^{}
como o segundo argumento degit tag
excluirá todas as tags anteriores com o mesmo nome.Considere a continuação da sessão anterior do terminal:
3. Salve a data
Por fim, se você quiser manter a data da tag original como a data da tag atualizada, use alguma mágica awk (ou similar) ou apenas cole a data desejada. A seguir, substitui o segundo exemplo (caso contrário, a data original seria perdida devido à substituição):
Referências:
SO: Listagem rápida de objetos no banco de dados git
SO: altere a data do commit de uma tag git
Awk: Um tutorial e introdução
SO: Filtre a saída pelo primeiro token de linha e extraia o restante da linha com awk
SO: Como colocar um comentário de linha bash em um comando de várias linhas
4. DIY
Como alternativa, para atualizar as tags, você pode excluí-las e criá-las novamente. Como se vê, a atualização apenas adiciona uma nova tag e faz com que ela aponte para a antiga, ou, como alternativa, exclui implicitamente a antiga e cria uma nova para apontar para o mesmo commit de qualquer maneira.
Você pode conseguir isso emitindo:
Aqui
[optional]
está um campo opcional;<required>
é um campo obrigatório. Obviamente, você pode adicionar qualquer sinalizador após ogit tag
comando que normalmente faria.fonte
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
A solução da @Andy
está errado . Depois disso, com
comando, veremos tags de pilha com o mesmo nome.
Ele adiciona uma nova marca com o mesmo nome e nova mensagem na confirmação
<tag-name>
. Mas não remove a tag antiga. É um caso especial deste comando:Mas
<old-tag>
é o mesmo com<tag-name>
.A solução correta é simples, basta atualizar a tag.
Lembre-se, apenas um aqui.
Se queremos alterar a tag, o que não é
HEAD
, precisamos de um<commit>
argumento extra .fonte
git show <tag>
e vejo todas as edições anteriores.HEAD
, passando o extra<commit>
, a tag aberta estará vazia. Eu esperava que a tag antiga fosse apenas editada. Existe caminho?git tag <commit> <tag-name> -f -a
tenha <commit> e <tag-name> revertido? Parece assim quando comparado com outras respostas e documentos, mas não sou especialista.Com o Git 2.17 (Q2 2018), haverá uma alternativa para a criação de uma nova tag
git tag <tag name> <tag name> -f -m "<new message>"
, já que a opção "git tag
" aprendeu um explícito "--edit
" que permite que a mensagem fornecida por "-m
" e "-F
" seja editada posteriormente.Veja commit 9eed6e4 (06 fev 2018) por Nicolas Morey-Chaisemartin (
nmorey
) .(Incorporado por Junio C Hamano -
gitster
- in commit 05d290e , 06 mar 2018)Adicione uma
--edit
opção que permita modificar as mensagens fornecidas por-m
ou-F
, da mesma formagit commit --edit
.fonte
--edit
esses endereços do OP?-f
sinalizador for adicionado também,--edit
ele editará a mensagem e modificará o carimbo de data e hora, certo?Você precisará marcar novamente, usando o
-f
sinalizador de força.fonte
Usando as respostas acima, este é o meu apelido para one-liner
.gitconfig
. Substitui a tag existente e preserva a data de confirmação.Melhorias?
fonte
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 '"
Se você estiver usando uma GUI como smartgit apenas
fonte