update tag git remove




Como faço para editar uma mensagem de tag existente no git? (6)

Gostaríamos de fazer mensagens v1.x parecido com a mensagem v2.0

Com o Git 2.17 (Q2 2018), haverá uma alternativa para criar uma nova tag com a tag git tag <tag name> <tag name> -f -m "<new message>" , já que " git tag " aprendeu uma explícita " --edit "opção que permite que a mensagem dada via" -m "e" -F "seja editada.

Veja commit 9eed6e4 (06 fev 2018) por Nicolas Morey-Chaisemartin ( nmorey ) .
(Mesclado por Junio ​​C Hamano - gitster - em commit 05d290e , 06 mar 2018)

tag : adicionar opção --edit

Adicione uma opção --edit que permita modificar as mensagens fornecidas por -m ou -F , da mesma forma que git commit --edit .

https://code.i-harness.com

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 que as mensagens da v1.x se parecessem com a mensagem v2.0. Alguém sabe como faríamos isso?


TL; DR

Você pode fazer isso excluindo sua tag e recriando-a enquanto falsifica a data e o autor:

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

Toda a história:

Com base na resposta da Sungram (originalmente proposta como uma edição):

1. Resposta aceita

Isso é uma melhoria em relação às respostas de Andy e Eric Hu . Suas respostas criarão um novo objeto de tag que referencia o antigo objeto de tag e ambos terão o mesmo nome.

Para ilustrar isso, considere o seguinte:

> 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. Melhoria do Sungram

Usando <tag name>^{} como o segundo argumento da git tag irá deletar todas as tags anteriores com o mesmo nome.

Considere a continuação da sessão de terminal anterior:

> 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. Salve a data

Por último, 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. O seguinte é um substituto para o segundo exemplo (caso contrário, a data original seria perdida devido à substituição):

> 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]

Referências:

  • SO: Listagem rápida de objetos no banco de dados git

  • SO: Altere a data do committer de uma tag do git

  • Awk: Um tutorial e introdução

  • SO: Filtre a saída pelo primeiro token-de-linha e extraia o resto da linha com o awk

  • SO: Como colocar comentário linha bash em um comando multi-line

4. DIY

Como alternativa à atualização das tags, você pode simplesmente excluí-las e criá-las novamente. Como acontece, a atualização apenas adiciona uma nova tag e a aponta para a antiga, ou, alternativamente, apenas exclui implicitamente a antiga e cria uma nova para apontar a mesma consolidação de qualquer maneira.

Você pode conseguir isso emitindo:

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

Aqui [optional] é um campo opcional; <required> é um campo obrigatório. Claro, você pode adicionar quaisquer flags após o comando git tag que você normalmente faria.


Solução do @Andy

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

está errado . Depois disso, com

git show

comando, vamos ver tags de pilha com o mesmo nome.

Ele adiciona uma nova tag com o mesmo nome da tag e nova mensagem no commit <tag-name> . Mas não remove tags antigas. É um caso especial deste comando:

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

Mas apenas <old-tag> é o mesmo com <tag-name> .

A solução correta é simples, basta atualizar a tag OK.

git tag <tag-name> -f -a

Lembre-se, apenas um aqui.

Se quisermos alterar tag, que não é HEAD , precisamos de um argumento <commit> .

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

Usando as respostas acima, este é o meu apelido para o .gitconfig . Substitui a tag existente e preserva a data de confirmação.

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

Melhorias?


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

Isso é uma melhoria em relação às respostas de Andy e Eric Hu . Suas respostas criarão um novo objeto de tag que referencia o antigo objeto de tag, onde ambos terão o mesmo nome de tag.

<tag name>^{} resolverá a tag / reference até encontrar o primeiro hash de confirmação.


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

Isso criará uma nova tag com o mesmo nome (sobrescrevendo a original).





git-tag