git remote prune - não mostrou tantos ramos podados quanto eu esperava

113

Na página de manual:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Então eu removi um monte de ramos usando

git push origin :staleStuff

e então correu

git remote prune origin

No entanto, apenas um único ramo local foi podado. Alguns desses ramos foram criados por mim, alguns por colegas de trabalho. Isso indica que eu não estava rastreando essas ramificações corretamente em primeiro lugar?

Felixyz
fonte
7
para descobrir quais branches serão removidos, você pode fazer git remote show origine procurar por qualquer branches marcadostale
Alguém em algum lugar

Respostas:

189

Quando você usa git push origin :staleStuff, ele remove automaticamente origin/staleStuff, portanto, quando você executou git remote prune origin, removeu algum ramo que foi removido por outra pessoa. É mais provável que seus colegas de trabalho agora precisem correr git prunepara se livrar dos ramos que você removeu.


Então o que exatamente git remote prunefaz? Idéia principal: branches locais (não rastreando branches) não são tocados por git remote prunecomando e devem ser removidos manualmente.

Agora, um exemplo do mundo real para melhor compreensão:

Você tem um repositório remoto com 2 ramos: mastere feature. Vamos supor que você esteja trabalhando em ambos os branches, então, como resultado, você tem essas referências em seu repositório local (nomes de referência completos são fornecidos para evitar qualquer confusão):

  • refs/heads/master(nome curto master)
  • refs/heads/feature(nome curto feature)
  • refs/remotes/origin/master(nome curto origin/master)
  • refs/remotes/origin/feature(nome curto origin/feature)

Agora, um cenário típico:

  1. Algum outro desenvolvedor termina todo o trabalho no feature, funde-o mastere remove o featurebranch do repositório remoto.
  2. Por padrão, quando você faz git fetch(ou git pull), nenhuma referência é removida de seu repositório local, então você ainda tem todas essas 4 referências.
  3. Você decide limpá-los e fugir git remote prune origin.
  4. git detecta que o featurebranch não existe mais, então refs/remotes/origin/featureé um branch obsoleto que deve ser removido.
  5. Agora você tem 3 referências, incluindo refs/heads/feature, porque git remote prunenão remove nenhuma refs/heads/*referência.

É possível identificar filiais locais, associadas a filiais de rastreamento remoto, por branch.<branch_name>.mergeparâmetro de configuração. Este parâmetro não é realmente necessário para que nada funcione (provavelmente exceto git pull), então pode estar faltando.

(atualizado com exemplos e informações úteis de comentários)

max
fonte
Eu entendi que a situação era: as filiais ainda estão presentes localmente, mas removidas do repo remoto. Agora, quero remover todos os branches locais que não existem no remoto, portanto, executo o git prune. Isso é o que "Esses branches obsoletos já foram removidos do repositório remoto" me diz. Estou errado?
Felixyz
3
Você está certo, mas pode ter entendido mal o significado de "agências locais" no caso de git prune. Apenas ramos em /refs/remotes/<remote_name>/estão sujeitos a poda; quaisquer ramos /refs/heads/não serão tocados - você deve gerenciá-los manualmente.
máximo de
Aha, isso é realmente o que eu pensei. Portanto, não há como fazer o que eu quero: excluir automaticamente todos os branches nos cabeçotes que estão rastreando branches remotos, verificando se esses branches remotos foram excluídos?
Felixyz
2
Não existe um comando embutido para isso, mas você mesmo pode escrever esse script. Os ramos de rastreamento podem ser identificados pela presença do branch.<branch_name>.mergeparâmetro de configuração.
máx.
Essa resposta seria melhor se você adicionasse as informações dos comentários à própria resposta, de modo que todos que vierem aqui e tenham o mesmo equívoco que @Felixyz não precisem ver sua resposta de forma engraçada e depois ler os comentários para finalmente obter compreensão .
Akrikos