Usamos tags no git como parte de nosso processo de implantação. Periodicamente, queremos limpar essas tags removendo-as do nosso repositório remoto.
Isso é bem direto. Um usuário exclui a marca local e a marca remota em um conjunto de comandos. Temos um pequeno script de shell que combina as duas etapas.
O segundo (terceiro, quarto, ...) usuário agora tem tags locais que não são mais refletidas no controle remoto.
Estou procurando um comando semelhante ao git remote prune origin
qual limpa as ramificações de rastreamento local para as quais a ramificação remota foi excluída.
Como alternativa, um comando simples para listar tags remotas pode ser usado para comparar com as tags locais retornadas por git tag -l
.
git config fetch.pruneTags true
fará comgit fetch
que você faça o que deseja! Veja minha resposta a essa outra pergunta .Respostas:
Boa pergunta. :) Eu não tenho uma resposta completa ...
Dito isto, você pode obter uma lista de tags remotas via
git ls-remote
. Para listar as tags no repositório referenciado pororigin
, você deve executar:Isso retorna uma lista de hashes e nomes de tags amigáveis, como:
Você certamente poderia montar um script bash para comparar as tags geradas por esta lista com as que você possui localmente. Dê uma olhada
git show-ref --tags
, que gera os nomes das tags da mesma forma quegit ls-remote
).Como um aparte,
git show-ref
tem uma opção que faz o oposto do que você gostaria. O comando a seguir listaria todas as tags na ramificação remota que você não possui localmente:fonte
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
Esta é uma ótima pergunta, eu estava pensando a mesma coisa.
Como não queria escrever um script, procurei uma solução diferente. A chave é descobrir que você pode excluir uma marca localmente e usar o git fetch para "recuperá-la" do servidor remoto. Se a tag não existir no controle remoto, ela permanecerá excluída.
Portanto, você precisa digitar duas linhas em ordem:
Estes:
Exclua todas as tags do repositório local. FWIW, xargs coloca cada tag de saída por "tag -l" na linha de comando para "tag -d". Sem isso, o git não excluirá nada porque não lê stdin (git bobo).
Busque todas as tags ativas no repositório remoto.
Isso funciona mesmo no Windows.
fonte
git tag prune origin
comando.git tag -l | %{git tag -d $_}
para fazer isso funcionar no PowerShell. Não tenho certeza sobre mais ninguém.Do Git v1.7.8 para v1.8.5.6, você pode usar isto:
Atualizar
Isso não funciona nas versões mais recentes do git (começando na v1.9.0) devido ao commit e66ef7ae6f31f2 . Eu realmente não quero excluí-lo, já que funcionou para algumas pessoas.
Conforme sugerido por "Chad Juliano", com todas as versões do Git desde a v1.7.8, você pode usar o seguinte comando:
Pode ser necessário incluir a parte de tags entre aspas (no Windows, por exemplo) para evitar a expansão de caracteres curinga:
fonte
git fetch --prune <remote> +refs/tags/*:refs/tags/*
não funcionou no ZSH no entanto, funciona em bash*
mas se você citar apenas isso deve ser bom.git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
podar ramificações e tags de rastreamento remoto. fez check-in na versão 2.18 do git.Se você deseja apenas as tags existentes no controle remoto, basta excluir todas as tags locais:
E, em seguida, busque todas as tags remotas:
fonte
xargs
. Se você tiver mais tagsARG_MAX
ou limitações semelhantes, isso não funcionará. Improvável, mas possível, e é por isso quexargs
é ótimo.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Comando de alias obrigatório. Aproveitar. :-)Parece que as versões recentes do Git (estou no git v2.20) permitem simplesmente dizer
Muito mais limpo!
https://git-scm.com/docs/git-fetch#_pruning
Você também pode configurar o git para remover sempre as tags ao buscar:
Se você desejar remover tags ao buscar em um controle remoto específico, poderá usar a
remote.<remote>.pruneTags
opção Por exemplo, para sempre remover tags ao buscar na origem, mas não em outros controles remotos,fonte
Todas as versões do Git desde a v1.7.8 são compreendidas
git fetch
com um refspec, enquanto que desde a v1.9.0 a--tags
opção substitui a--prune
opção. Para uma solução de uso geral, tente o seguinte:Para ler mais sobre como o comportamento "--tags" com "--prune" mudou no Git v1.9.0, consulte: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
fonte
origin
porupstream
e git corrigi minhas tags locais com base no upstream; Em seguida,git push origin :<deleted-tag-name>
atualizei meu fork do GitHub, removendo a tag excluída.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
O Git suporta nativamente a limpeza de tags locais:
Este comando extrai as tags mais recentes e remove todas as tags excluídas.
fonte
este é um bom método:
git tag -l | xargs git tag -d && git fetch -t
Fonte: demisx.GitHub.io
fonte
Mostre a diferença entre tags locais e remotas:
git tag
fornece a lista de tags locaisgit ls-remote --tags
fornece a lista de caminhos completos para tags remotascut -f2 | grep -v '\^' | sed 's#refs/tags/##'
analisa apenas o nome da marca na lista de caminhos de marca remotaAs linhas que começam com "<" são suas tags locais que não estão mais no repositório remoto. Se forem poucos, você poderá removê-los manualmente, um por um, se forem muitos, você fará mais grep-ing e tubulação para automatizá-lo.
fonte
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, mas um número seguido de uma vírgula e, em seguida, o que parece os três primeiros caracteres de um hash de confirmação (?), por exemplo7,8d4
...Acabei de adicionar um comando git sync-local-tags ao pivotal_git_scripts fork do Gem no GitHub:
https://github.com/kigster/git_scripts
Instale a gema e execute "git sync-local-tags" em seu repositório para excluir as marcações locais que não existem no controle remoto.
Como alternativa, você pode instalar este script abaixo e chamá-lo de "git-sync-local-tags":
fonte
Eu sei que estou atrasado para a festa, mas agora há uma resposta rápida para isso:
Sim, agora é uma opção para buscar.
Se você não deseja buscar e apenas poda:
fonte
Que tal isso - largue todas as tags locais e depois busque novamente? Considerando que seu repo pode conter submódulos:
fonte
O TortoiseGit pode comparar tags agora.
O registro esquerdo está no controle remoto, o direito está no local.
Usando o recurso Tags de comparação da caixa de diálogo Sincronizar:
Veja também a edição 2973 do TortoiseGit
fonte
A mesma resposta que @Richard W, mas para Windows (PowerShell)
fonte
Eu adiciono o comando
SourceTree
como uma Ação personalizada no meu MacOS.Definir
Custom Actions
porSourcetree
->Preferences...
->Custom Actions
Script to run
tem que ser ogit
caminho.Eu uso
git fetch --prune --prune-tags origin
para sincronizar tags de remoto para local.fonte
Na nova versão do git (como v2.26.2)
Então você precisaria executar:
fonte