Minha situação é essa ... alguém que trabalha no mesmo repositório excluiu um ramo de seu repositório local e remoto ...
A maioria das pessoas que perguntou sobre esse tipo de problema no Stack Overflow ou em outros sites ainda tem o problema de ramificações em sua lista de ramificações de rastreamento remoto git branch -a
na parte inferior:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
No entanto, na minha situação, o ramo que não deveria estar lá é local:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Quando eu faço qualquer um dos seguintes, ele não é removido localmente:
$ git prune
Eu também tentei:
$ git remote prune origin
$ git fetch --prune
Informações mais úteis: quando eu verifico, git remote show origin
é assim que fica:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Observe que está apenas na seção intitulada Local branches configured for 'git pull':
Por quê?
git
remote-branch
gogogadgetinternet
fonte
fonte
git branch -d the_local_branch
x/y
): foi corrigido (ver minha resposta abaixo )Respostas:
Não culpo você por ficar frustrado com isso. A melhor maneira de olhar é essa. Há potencialmente três versões de cada filial remota:
(por exemplo, repo remoto em https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(por exemplo, repositório local
refs/remotes/origin/master
)(por exemplo, repositório local
refs/heads/master
)Vamos começar com
git prune
. Isso remove objetos que não estão mais sendo referenciados, mas não remove referências. No seu caso, você tem uma filial local. Isso significa que há um ref nomeadorandom_branch_I_want_deleted
que se refere a alguns objetos que representam o histórico desse ramo. Portanto, por definição,git prune
não será removidorandom_branch_I_want_deleted
. Realmente,git prune
é uma maneira de excluir dados acumulados no Git, mas que não estão sendo referenciados por nada. Em geral, isso não afeta sua visão de nenhum ramo.git remote prune origin
egit fetch --prune
ambos operam nas referências abaixorefs/remotes/...
(eu as referirei como referências remotas). Não afeta as ramificações locais. Agit remote
versão é útil se você deseja remover apenas referências remotas em um controle remoto específico. Caso contrário, os dois fazem exatamente a mesma coisa. Então, resumindo,git remote prune
egit fetch --prune
opere no número 2 acima. Por exemplo, se você excluiu um ramo usando a GUI da web git e não deseja que ele apareça mais na sua lista local de ramos (git branch -r
), esse é o comando que você deve usar.Para remover uma ramificação local, você deve usar
git branch -d
(ou-D
se não for mesclado em nenhum lugar). FWIW, não há comando git para remover automaticamente as ramificações de rastreamento local se uma ramificação remota desaparecer.fonte
xargs git branch -D
, mas nota que os novos ramos que você criou, mas nunca empurrado para o servidor seria excluído, assim pisar com cuidado:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
arquivo na.git
área), portanto, não é necessariamente uma questão simples de excluí-las via explorador de arquivos. Melhor usar os comandos para garantir que ambos sejam resolvidos corretamente.git remote prune
egit fetch --prune
faça o mesmo: excluindo os árbitros nos ramos que não existem no controle remoto, como você disse. O segundo comando se conecta ao controle remoto e busca suas ramificações atuais antes da remoção.No entanto, ele não toca nos ramos locais que você efetuou check-out, que você pode simplesmente excluir com
Substitua
-d
por-D
se o ramo não for mesclado em outro lugargit prune
faz algo diferente, elimina objetos inacessíveis, aqueles commits que não são alcançáveis em nenhuma ramificação ou tag e, portanto, não são mais necessários.fonte
git prune
procura não apenas ramos e tags, mas todos os outros árbitros também.git remote prune
)No caso de alguém estar interessado. Aqui está um rápido script de shell que removerá todas as ramificações locais que não são rastreadas remotamente. Uma palavra de cautela: Isso eliminará qualquer ramo que não seja rastreado remotamente, independentemente de ter sido mesclado ou não.
Se vocês encontrarem algum problema com isso, avise-me e eu o corrigirei (etc. etc.)
Salve-o em um arquivo chamado
git-rm-ntb
(chame o que for)PATH
e execute:git-rm-ntb <remote1:optional> <remote2:optional> ...
fonte
Observe que uma diferença entre
git remote --prune
egit fetch --prune
está sendo corrigida, com commit 10a6cc8 , por Tom Miller (tmiller
) (para git 1.9 / 2.0, primeiro trimestre de 2014):Assim: quando um repo upstream possui uma ramificação ("frotz") com o mesmo nome que uma hierarquia de ramificação ("frotz / xxx", uma possível convenção de nomenclatura de ramificação ),
git remote --prune
foi bem-sucedida (na limpeza da ramificação de rastreamento remoto do seu repo) , masgit fetch --prune
estava falhando.Não mais:
fonte