Como remover uma marca git remota?

Como é que se apaga uma etiqueta git que já foi carregada?

 2247
Author: markdorison, 2011-03-30

18 answers

Basta carregar numa referência 'vazia' ao nome da marca remota:

git push origin :tagname

Ou, mais expressivamente, use a opção --delete (ou -d Se a sua versão git tiver mais de 1, 8, 0):

git push --delete origin tagname

Se também precisar de apagar a marca local, use:

git tag --delete tagname

Antecedentes

Empurrar um ramo, etiqueta, ou outro ref para um repositório remoto envolve especificar "empurrar onde, Que fonte, que Destino?"

git push where-to-push source-ref:destination-ref
Um exemplo do mundo real onde você empurra o teu ramo mestre para o ramo mestre da origem é:
git push origin refs/heads/master:refs/heads/master

Que por causa dos caminhos padrão, pode ser encurtado para:

git push origin master:master

As Marcas funcionam da mesma forma:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Que também pode ser encurtado para:

git push origin release-1.0:release-1.0

Omitindo o REF fonte (a parte antes do cólon), você empurra 'nada' para o destino, apagando o ref na extremidade remota.

 3728
Author: Adam Franco, 2017-09-30 03:52:52

Uma maneira mais simples é

git push --delete origin YOUR_TAG_NAME

A sintaxe dos dois pontos é um pouco estranha nesta situação

 259
Author: quexer, 2015-05-05 10:30:55

Se tiver uma marca remota v0.1.0 Para Apagar, e a sua Remota for origin, Então simplesmente:

git push origin :refs/tags/v0.1.0

Se também tiver de apagar a marca localmente:

git tag -d v0.1.0

Ver a resposta de Adam Franco para uma explicação da sintaxe incomum do Git: para a eliminação.

 141
Author: Alex Dean, 2018-05-03 19:03:23

Apagar Todas as marcas locais e obter a lista de marcas remotas:

git tag -l | xargs git tag -d
git fetch

Remover todas as marcas remotas

git tag -l | xargs -n 1 git push --delete origin

Limpar as marcas locais

git tag -l | xargs git tag -d
 76
Author: Siddhartha Mukherjee, 2016-06-20 18:29:51

Para remover a marca do repositório remoto:

git push --delete origin TAGNAME

Também poderá querer apagar a marca localmente:

git tag -d TAGNAME
 27
Author: Andrea, 2014-09-04 10:30:51

Do seu terminal, faça isto:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
Agora vai para Github.com e refresh, eles desaparecem.
 18
Author: Mahmoud Zalt, 2017-01-04 17:00:16

Basta notar que, se você tem um ramo remoto nomeado como uma marca remota, estes comandos são ambíguos:

git push origin :tagname
git push --delete origin tagname

Por isso deve usar este comando para apagar a marca:

git push origin :refs/tags/<tag>

E este para apagar o ramo:

git push origin :refs/heads/<branch>

Se não, você teria um erro como este:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
 14
Author: Alex Vazquez Fente, 2016-05-27 10:37:51

Se criou uma marca chamada release01 num repositório Git, iria removê-la do seu repositório fazendo o seguinte:

git tag -d release01 
git push origin :refs/tags/release01 

Para remover um de um repositório Mercurial:

hg tag --remove featurefoo

Por Favor referência https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

 9
Author: MeganZhou, 2016-05-27 10:38:45

Apagar a marca local '12345'

git tag -d 12345

Apagar a marca remota '12345' (eg; versão também do GitHub)

git push origin :refs/tags/12345

Abordagem alternativa

git push --delete origin tagName
git tag -d tagName

enter image description here

 6
Author: Lyes CHIOUKH, 2018-05-02 13:12:31

As outras respostas apontam como conseguir isso, mas você deve ter em mente as consequências, uma vez que este é um repositório remoto.

A página do Git tag man, na secção sobre Retagging, tem uma boa explicação de como informar cortesmente os outros utilizadores do remote repo sobre a mudança. Eles até dão um modelo de anúncio útil para comunicar como os outros devem obter as suas alterações.

 5
Author: Richard Venable, 2013-03-04 17:04:01

Até 100x método mais rápido para milhares de marcas remotas

Depois de ler através destas respostas enquanto necessitava de apagar mais de 11.000 etiquetas, aprendi estes métodos confiando ou {[[4]} demoram muito tempo, a menos que tenham horas para queimar.

Lutando, encontrei dois caminhos muito mais rápidos. Para ambos, comece por git tag ou git ls-remote --tags para fazer uma lista de marcas que deseja apagar no remoto. Nos exemplos abaixo pode omitir ou substituir sorting_proccessing_etc por qualquer grep ing, sort ing, tail ing ou head ing you want (e.g. grep -P "my_regex" | sort | head -n -200 etc) :

Este primeiro método é de longe o mais rápido, talvez 20 a 100 vezes mais rápido do que usar xargs, e funciona com pelo menos vários milhares tags de cada vez.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh
Como é que isto funciona? A lista normal, separada por linhas, de marcas é convertida para uma única linha de marcas separadas por espaços, cada uma delas precedida por : Assim . . .
tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

Usando git push com esta marca de formato empurra nada em cada ref remoto, apagando-o (o formato normal para empurrar desta forma é local_ref_path:remote_ref_path).

O Método dois é descrito como uma resposta separada noutro lugar nesta mesma página


Depois de ambos os métodos, você provavelmente vai querer apagar as suas etiquetas locais também. Isto é muito mais rápido para que possamos voltar a usar xargs e git tag -d, o que é suficiente.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

Ou semelhante à remoção remota:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
 5
Author: TonyH, 2017-09-07 21:18:25

Eu queria remover todas as etiquetas excepto as que correspondem a um padrão para que eu pudesse apagar todas, menos os últimos dois meses de tags de produção, aqui está o que eu usei para grande sucesso:

Apagar Todas As Marcas Remotas E Excluir A Expressão Da Remoção

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Apagar Todas As Marcas Locais E Excluir A Expressão Da Remoção

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
 5
Author: Lucent Fox, 2017-09-25 23:11:03

Um programa simples para remover a marca dada dos locais de origem e local. Com uma verificação se o tag realmente existe.

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

Como Utilizar:

  • criar um ficheiro de script shell (e.g. git-tag-purge.sh) e conteúdo de pasta.
  • chmod o seu ficheiro de script para o tornar executável.
  • tornar o script globalmente disponível
  • cd para o seu projecto git
  • = = Ligações externas = =
$>git-tag-purge.sh tag_name
)
 4
Author: Dimitar Vlasev, 2017-04-25 12:07:52
Parece muito trabalho para algo que já faz. Olhando para trás através desta linha, eu estou supondo que a lentidão com {[[2]} que você experimentou é porque a resposta original usada {[[4]} quando ele realmente não precisava.

Isto é equivalente ao seu método um, excepto que xargs lida automaticamente com o comprimento máximo da linha de comandos:

git tag | sorting_processing_etc | xargs git push --delete origin

xargs pode executar processos em paralelo também. Método 2 com xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

As utilizações acima indicadas são, no máximo, de 5 processos para lidar com um máximo de 100 argumentos em cada processo. Você pode experimentar com os argumentos para encontrar o que funciona melhor para suas necessidades.

 3
Author: HomerM, 2017-06-05 15:21:38

Como @CubanX sugeriu, eu dividi esta resposta do meu original:

Aqui está um método que é várias vezes mais rápido do que xargse pode escalar muito mais com ajustes. Ele usa o Github API, um token de acesso pessoal, e alavanca o utilitário parallel.
git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallel tem muitos modos operacionais, mas geralmente paralisa qualquer comando que você lhe dê, permitindo-lhe definir limites no número de processos. Você pode alterar o --jobs 2 parâmetro para permitir uma operação mais rápida, mas eu tive problemas com o Github é limites de taxa de, que são atualmente 5000/hr, mas também parece ter um indocumentados curto-prazo limite de bem.


Depois disto, provavelmente também vai querer apagar as etiquetas locais. Isto é muito mais rápido para que possamos voltar a usar xargs e git tag -d, o que é suficiente.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
 3
Author: TonyH, 2017-09-07 21:00:46

Se estás a usar o PowerShell, e queres apagar um monte deles:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Claro que também os Pode filtrar antes de apagar:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
 2
Author: rsenna, 2017-08-23 11:44:15

Se tiver uma marca criada a partir do # carácter, por exemplo #ST002, você pode descobrir que u não é capaz de apagar usando padrões normais. ou seja

git tag -d #STOO2

Não irá apagar a marca, mas envolvê-la num texto Literal Como assim

git tag -d "#ST002" or git tag -d '#ST002'
Isso vai apagá-lo. Esperando que ajude alguém que cometeu o erro de usar # para escrever nomes de marcas.
 2
Author: Royal XL, 2018-04-12 16:23:38
Aqui está um testcase local para testá-lo localmente sem mexer com um remoto.
~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest
 2
Author: Adnan Y, 2018-05-03 18:36:00