Trabalho em dois computadores diferentes (A e B) e armazeno um controle remoto comum do git no diretório dropbox.
Digamos que eu tenha dois ramos, mestre e desenvolvimento. Ambos estão rastreando suas origens / mestre e origem / desenvolvimento de suas contrapartes remotas.
Agora, enquanto estiver no computador A, excluo o branch devel, no local e no remoto.
git push origin :heads/devel
git branch -d devel
Executando git branch -a
no computador A, recebo a seguinte lista de ramificações.
- mestre
- origem / CABEÇA
- origem / mestre
Executando git fetch
no computador B, posso remover o ramo de desenvolvimento local com git branch -d devel
, mas não consigo remover o ramo de desenvolvimento remoto.
git push origin :heads/devel
retorna as seguintes mensagens de erro.
erro: não é possível enviar por push para um destino não qualificado: heads / proxy3d
O refspec de destino não corresponde a uma ref existente no controle remoto nem começa com refs /, e não podemos adivinhar um prefixo com base na ref de origem.
fatal: A extremidade remota desligou inesperadamente
git branch -a
ainda lista origem / desenvolvimento nos ramos remotos.
Como posso limpar as ramificações remotas do computador B?
fonte
Respostas:
Primeiro, qual é o resultado da
git branch -a
máquina B?Segundo, você já tiver eliminado
heads/devel
emorigin
, então é por isso que você não pode excluí-lo da máquina B.Tentar
ou
ou
e sinta-se à vontade para adicionar
--dry-run
ao final da suagit
declaração o resultado de executá-lo sem executá-lo.Documentos para
git remote prune
egit branch
.fonte
git remote prune origin
trabalhou para mim =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
mostra o que seria excluído sem realmente fazer isso.git fetch origin --prune
foi perfeito para remover ramos excluídosgit branch -vv
seguidogit branch -D branchname
e finalmente a ameixa é o melhor caminho.git config remote.origin.prune true
Considere executar:
Regularmente em cada repositório para remover ramificações locais que rastrearam uma ramificação remota que foi excluída (não existe mais no repositório GIT remoto).
Isso pode ser simplificado ainda mais por
essa é uma
per-repo
configuração que fará com que qualquer futurogit fetch or git pull
seja removido automaticamente .Para configurar isso para o seu usuário, você também pode editar o .gitconfig global e adicionar
No entanto, é recomendável que isso seja feito usando o seguinte comando:
ou aplicá-lo em todo o sistema (não apenas para o usuário)
fonte
Aqui está o script bash que pode fazer isso por você. É a versão modificada do script http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Minha modificação permite suportar diferentes locais remotos.
fonte
sed
s. Substituirsed 's/\(.*\)\/\(.*\)/\1/g'
porsed 's/\([^/]*\)\/\(.*\)/\1/g'
Este comando "executar a seco" excluirá todas as
origin
ramificações remotas ( ) mescladas, além demaster
. Você pode alterar isso ou adicionar ramificações adicionais após o mestre:grep -v for-example-your-branch-here |
Se parecer bom, remova o
--dry-run
. Além disso, você pode testar isso primeiro em um garfo.fonte
Se
git branch -r
mostrar muitas ramificações de rastreamento remoto nas quais você não está interessado e deseja removê-las apenas da local, use o seguinte comando:Uma versão mais segura seria remover apenas as versões mescladas:
Isso pode ser útil para projetos grandes, nos quais você não precisa das ramificações de recursos de outros colegas de equipe, mas há muitas ramificações de rastreamento remoto buscadas no clone inicial.
No entanto, essa etapa por si só não é suficiente, porque as ramificações de rastreamento remoto excluídas retornariam a seguir
git fetch
.Para parar de buscar essas ramificações de rastreamento remoto, você precisa especificar explicitamente os refs para buscar em .git / config :
No exemplo acima, nós só buscar
master
,develop
e liberar ramos, sinta-se livre para se adaptar como você precisa.fonte
git fetch origin branchname
ou criar um alias, comoft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
buscar apenas a ramificação atual (o meu favorito). Felicidades.-r
bandeira? Eu vejo quexargs
tem uma-R
discussão, mas não encontrei nada-r
. Quero dizer, em teoria, se me lembro corretamente comoxargs
funciona, mesmo sem-r
ele deve funcionar.| xargs git branch -d
. Além disso, removendo a-r
opção (--remotes
) degit branch -d
apenas limpamos as ramificações locais (o que pode ser suficiente, considerando que, por padrãogit branch
, não mostra ramificações remotas).xargs -r
, a saber--no-run-if-empty
, é uma extensão GNU, aqui está uma boa explicação .A exclusão é sempre uma tarefa desafiadora e pode ser perigosa !!! Portanto, primeiro execute o seguinte comando para ver o que acontecerá:
Ao fazer o procedimento acima,
git
você fornecerá uma lista do que aconteceria se o comando abaixo fosse executado.Em seguida, execute o seguinte comando para remover todas as ramificações do repositório remoto que não estão no repositório local:
fonte
-n
(execução a seco) a este comando para que você possa visualizar as alterações e, se estiver tudo bem, chame-o novamente sem-n
.Aqui está como fazer isso com o SourceTree (v2.3.1):
1. Clique em Buscar
2. Marque "Remover ramos de rastreamento ..."
3. Pressione OK
4. 😀
fonte
Vou ter que adicionar uma resposta aqui, porque as outras respostas não estão cobrindo meu caso ou são desnecessariamente complicadas. Eu uso o github com outros desenvolvedores e só quero que todas as ramificações locais cujos controles remotos foram (possivelmente mesclados e) excluídos de um PR do github sejam excluídos de uma só vez da minha máquina. Não, coisas como
git branch -r --merged
não abrangem os ramos que não foram mesclados localmente ou os que não foram mesclados (abandonados) etc., portanto, é necessária uma solução diferente.Enfim, o primeiro passo que recebi de outras respostas:
Uma execução seca
git remote prune origin
parecia fazer a mesma coisa no meu caso, então fui com a versão mais curta para simplificar.Agora, a
git branch -v
deve marcar os ramos cujos controles remotos são excluídos como[gone]
. Portanto, tudo o que preciso fazer é:Tão simples como isso, exclui tudo o que desejo para o cenário acima.
A
xargs
sintaxe menos comum é que ele também funciona em Mac e BSD, além do Linux. Cuidado, esse comando não é executado a seco, portanto, forçará a exclusão de todos os ramos marcados como[gone]
. Obviamente, sendo esse git, nada se foi para sempre, se você ver os ramos excluídos que você lembra que queria manter, sempre poderá desfazê-los (o comando acima terá listado seu hash na exclusão, portanto, é simplesgit checkout -b <branch> <hash>
.fonte
Podar as mesmas ramificações de referências locais e remotas (no meu exemplo de
origin
).fonte