Como você exclui uma tag Git que já foi enviada por push?
Você só precisa enviar uma referência 'vazia' ao nome do tag remoto:
git push origin :tagname
Ou, mais expressivamente, use a --delete
opção (ou -d
se sua versão do git for anterior à 1.8.0):
git push --delete origin tagname
Observe que o git tem namespace de tag e namespace de ramificação, portanto você pode usar o mesmo nome para uma ramificação e uma tag. Se você quiser ter certeza de que não pode remover acidentalmente a ramificação em vez da tag, poderá especificar ref completo que nunca excluirá uma ramificação:
git push origin :refs/tags/tagname
Se você também precisar excluir a tag local, use:
git tag --delete tagname
Enviar uma ramificação, tag ou outra referência para um repositório remoto envolve especificar "qual repositório, qual fonte, qual destino?"
git push remote-repo source-ref:destination-ref
Um exemplo do mundo real em que você envia sua ramificação principal para a ramificação principal da origem é:
git push origin refs/heads/master:refs/heads/master
Que, devido aos caminhos padrão, pode ser reduzido para:
git push origin master:master
Tags funcionam da mesma maneira:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
O que também pode ser reduzido para:
git push origin release-1.0:release-1.0
Ao omitir a ref da fonte (a parte antes dos dois pontos), você pressiona 'nada' para o destino, excluindo a ref na extremidade remota.
git push --delete origin tag1 tag2
. Mesmo é válido para as tags eliminação locaisgit tag -d tag1 tag2
tag
está anexado a um único commit. Por esse motivo, o nome do ramo é irrelevante.git tag -d `git tag`
excluirá todas as tags locais. O mesmo se aplica aogit push --delete origin `git tag`
assumir que você puxou as tags remotas localmente. Isso foi útil em um ambiente de teste.Uma maneira mais direta é
A sintaxe do cólon com prefixo da IMO é um pouco estranha nessa situação
fonte
git push --delete origin "TAGNAME"
:, onde TAGNAME é o nome da tag original.tag
antes do nome da tag para garantir a obtenção da tag, não da ramificação.refs/tags/
, como este:refs/tags/v2.3.1
.Se você tiver um tag remoto
v0.1.0
para excluir e o seu controle remoto estiverorigin
, basta:Se você também precisar excluir a tag localmente:
Veja a resposta de Adam Franco para uma explicação da
:
sintaxe incomum do Git para exclusão.fonte
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?:tagname
deve funcionar para a exclusão remota.Exclua todas as tags locais e obtenha a lista de tags remotas :
Remova todas as tags remotas
Limpar tags locais
fonte
Para remover a marca do repositório remoto:
Você também pode excluir a tag localmente:
fonte
git push --delete origin TAGNAME && git tag -d TAGNAME
No seu terminal, faça o seguinte:
Agora vá ao Github.com e atualize, eles desaparecem.
fonte
your_tag_name
do repositório local .your_tag_name
do repositório remoto .fonte
Excluir marca local '12345'
Exclua a tag remota '12345' (por exemplo, versão do GitHub também)
Abordagem alternativa
fonte
Observe que, se você tiver uma ramificação remota nomeada como tag remota, esses comandos serão ambíguos:
Portanto, você deve usar este comando para excluir a tag:
e este para excluir o ramo:
Caso contrário, você receberá um erro como este:
fonte
Método até 100x mais rápido para milhares de tags remotas
Depois de ler essas respostas e precisar excluir mais de 11.000 tags, aprendi esses métodos dependendo ou
xargs
demorando muito, a menos que você tenha horas para gravar.Lutando, encontrei duas maneiras muito mais rápidas. Para ambos, comece com
git tag
ougit ls-remote --tags
faça uma lista de tags que deseja excluir no controle remoto. Nos exemplos abaixo, você pode omitir ou substituirsorting_proccessing_etc
por qualquergrep
ing,sort
ing,tail
ing ouhead
ing que desejar ( por exemplo,grep -P "my_regex" | sort | head -n -200
etc ):Esse primeiro método é de longe o mais rápido, talvez 20 a 100 vezes mais rápido que o uso
xargs
, e funciona com pelo menos vários milhares de tags por vez.Como é que isso funciona? A lista normal de tags separadas por linhas é convertida em uma única linha de tags separadas por espaço, cada uma delas anexada a ele
:
. . .O uso
git push
dessa tag de formato não empurra nada para cada referência remota, apagando-a (o formato normal para empurrar dessa maneira élocal_ref_path:remote_ref_path
).O método dois é dividido como uma resposta separada em outro lugar nesta mesma página
Após os dois métodos, você provavelmente também desejará excluir suas tags locais. Isso é muito mais rápido, para que possamos voltar a usar
xargs
egit tag -d
, o que é suficiente.OU semelhante à exclusão remota:
fonte
Se você usar o SourceTree - uma ótima interface gráfica do Git -, poderá fazer isso facilmente sem a linha de comando, fazendo o seguinte:
YOUR_TAG_NAME agora será removido do seu repositório local e de todos os controles remotos - seja GitHub, BitBucket ou qualquer outro local que você listou como remoto para esse repositório.
Além disso, se você excluiu uma marca localmente, mas não nas origens remotas, e deseja excluí-la em todos os lugares, crie uma nova marca que tenha o mesmo nome e esteja anexada no mesmo commit das origens. Em seguida, repita as etapas acima para excluir todos os lugares.
fonte
Se você criou uma tag chamada
release01
em um repositório Git, você a remove do seu repositório, fazendo o seguinte:Para remover um de um repositório Mercurial:
Consulte https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
fonte
Se você estiver usando o PowerShell e deseja excluir vários deles:
Obviamente, você também pode filtrá-los antes de excluir:
fonte
Como o @CubanX sugeriu, eu dividi esta resposta do meu original:
Aqui está um método que é várias vezes mais rápido do que
xargs
e pode escalar muito mais com os ajustes. Ele usa a API do Github , um token de acesso pessoal e aproveita o utilitárioparallel
.parallel
possui muitos modos de operação, mas geralmente paralela qualquer comando que você der, permitindo definir limites para o número de processos. Você pode alterar o--jobs 2
parâmetro para permitir uma operação mais rápida, mas tive problemas com os limites de taxa do Github , que atualmente são de 5000 / h, mas também parece ter um limite de curto prazo não documentado.Depois disso, você provavelmente também desejará excluir suas tags locais. Isso é muito mais rápido, para que possamos voltar a usar
xargs
egit tag -d
, o que é suficiente.fonte
As outras respostas apontam como fazer isso, mas você deve ter em mente as conseqüências, pois este é um repositório remoto.
A página man da tag git, na seção On Retagging , tem uma boa explicação de como informar educadamente os outros usuários do repo remoto sobre a mudança. Eles até fornecem um modelo de anúncio útil para comunicar como os outros devem receber suas alterações.
fonte
Eu queria remover todas as tags, exceto aquelas que correspondam a um padrão, para poder excluir todas as tags de produção, exceto os últimos dois meses, eis o que eu usei com grande sucesso:
Excluir todas as tags remotas e excluir expressões de excluir
Excluir todas as tags locais e excluir expressões de excluir
fonte
Script simples para remover a tag especificada dos locais local e de origem. Com uma verificação se a etiqueta realmente existe.
Como usar:
fonte
Parece muito trabalho para algo que
xargs
já faz. Olhando para trás neste tópico, acho que a lentidãoxargs
que você experimentou é porque a resposta original foi usadaxargs -n 1
quando realmente não era necessária.Isso é equivalente ao seu método 1, exceto que
xargs
lida automaticamente com o comprimento máximo da linha de comando:xargs
também pode executar processos em paralelo. Método 2 comxargs
:O exemplo acima usa no máximo 5 processos para manipular no máximo 100 argumentos em cada processo. Você pode experimentar os argumentos para descobrir o que funciona melhor para suas necessidades.
fonte
Se você criou uma tag iniciando com o caractere # , por exemplo
#ST002
, pode achar que não é possível excluir usando padrões normais. ieNão excluirá a tag, mas a envolverá em um String Literal como esse
Isso fará com que seja excluído. Espero que ajude alguém que cometeu o erro de usar # para escrever nomes de tags.
fonte
Aqui está um caso de teste local para testá-lo localmente sem mexer com um controle remoto:
fonte
Oi, só queria compartilhar um alias que eu criei que faz a mesma coisa:
Adicione o seguinte ao seu ~ / .gitconfig
O uso é semelhante a:
fonte