AVISO: Isso não preservará mensagens de tag para tags anotadas.
Resumo
Para cada tag que precisa ser alterada:
- Volte no tempo para o commit que representa a tag
- Exclua a tag (local e remotamente)
- Isso transformará sua "versão" no GitHub em um rascunho que você pode excluir posteriormente.
- Adicione novamente a tag com o mesmo nome usando uma invocação mágica que define sua data para a data do commit.
- Envie as novas tags com datas fixas de volta ao GitHub.
- Vá para o GitHub, exclua todas as versões de rascunho e recrie as novas versões a partir das novas tags
Em código:
# Fixing tag named '1.0.1'
git checkout 1.0.1 # Go to the associated commit
git tag -d 1.0.1 # Locally delete the tag
git push origin :refs/tags/1.0.1 # Push this deletion up to GitHub
# Create the tag, with a date derived from the current head
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 1.0.1 -m"v1.0.1"
git push --tags # Send the fixed tags to GitHub
Detalhes
De acordo com Como marcar no Git :
Se você se esquecer de marcar um lançamento ou aumento de versão, pode sempre marcá-lo retroativamente como:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
E embora seja perfeitamente utilizável, tem o efeito de colocar suas tags fora da ordem cronológica, o que pode atrapalhar os sistemas de construção que procuram pela tag "mais recente". Mas não tenha medo. Linus pensou em tudo:
# This moves you to the point in history where the commit exists
git checkout SHA1_OF_PAST_COMMIT
# This command gives you the datetime of the commit you're standing on
git show --format=%aD | head -1
# And this temporarily sets git tag's clock back to the date you copy/pasted in from above
GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
# Combining the two...
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
No entanto, se você já adicionou a tag, você não pode usar o acima com git tag -f existingtag
ou então o git reclamará quando você tentar mesclar:
Rammy:docubot phrogz$ git push --tags
To [email protected]:Phrogz/docubot.git
! [rejected] 1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to '[email protected]:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.
Em vez disso, você deve remover a tag localmente:
git tag -d 1.0.1
Envie essa exclusão remotamente:
git push origin :refs/tags/1.0.1
No GitHub, recarregue as versões - a versão agora foi marcada como "Rascunho" - e remova o rascunho.
Agora, adicione a tag retroativa com base nas instruções acima e, por fim, envie a tag resultante ao GitHub:
git push --tags
e, em seguida, adicione novamente as informações de lançamento do GitHub.
git tag -l | while read -r tag; do `git checkout $tag && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a $tag -m"$tag"`; done; git push --tags
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a $tag -m"$tag" $COMMIT_HASH ; done && git push --tags
git tag -af
torna-d
desnecessário e você permanece local para que possa verificar se está tudo bem - então você podegit push --tags -f
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force
$env:GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800"
egit tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
Aqui está uma frase com base em alguns dos comentários na outra resposta:
Para decompô-lo ...
Obrigado a @Mr_and_Mrs_D pela sugestão de usar um único push.
fonte
Com base nas outras respostas, aqui está uma forma que irá preservar a primeira linha da mensagem de tag
O bit responsável por preservar as mensagens é:
head -n1
pegará a primeira linha da mensagem de confirmação antiga. Você pode modificá-lo para-n2
ou-n3
etc para obter duas ou três linhas.Se você deseja alterar a data / hora para apenas uma tag, é assim que você pode quebrar o one-liner para fazer isso em seu shell bash:
Referências:
fonte
-s
sinalizador que não está presente no one-liner, então eu estava recebendoerror: gpg failed to sign the data
porque não tenho a assinatura configurada para o git. Esse erro me confundiu um pouco.