Como remover uma marca git remota?
Como é que se apaga uma etiqueta git que já foi carregada?
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.
Uma maneira mais simples é
git push --delete origin YOUR_TAG_NAME
A sintaxe dos dois pontos é um pouco estranha nesta situação
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.
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
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
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.
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>'
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
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.
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 porgit 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 " ")
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
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)
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.
Como @CubanX sugeriu, eu dividi esta resposta do meu original:
Aqui está um método que é várias vezes mais rápido do quexargs
e 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
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 $_ }
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.
~/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