Como você remove uma referência de filial remota inválida do Git?


731

No meu repo atual, tenho a seguinte saída:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Eu quero excluir remotes/public/masterda lista de ramificações:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Além disso, a saída de git remoteé estranha, pois não lista public:

$ git remote show 
origin

Como posso excluir 'controles remotos / público / mestre' da lista de ramificações?

Atualização, tentei o git pushcomando:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
Funcionou git remote prune [remote-name]ou git fetch -p [remote-name]não no seu cenário? Fazer isso com git gcmuito mais força do que normalmente é necessário.
Rjmunro 6/12/12

6
git remote prune [remote-name]não funcionará com o git svn, embora nem git gc... git branch -rd origin/namefuncione. @ Casey, você provavelmente deve selecionar a segunda resposta - é um pouco menos perigosa.
naught101

4
Eu amo essa pergunta. Voltando quase todos os meses
oluckyman 18/06/2015

Relacionado, se não um destino idiota: Exclua uma ramificação do Git local e remotamente .

2
Para evitar erros de n00b gitter no futuro, recomendo usar uma ramificação de exemplo diferente de master... particularmente ao excluir no controle remoto.
absynce

Respostas:


743

Você pode estar precisando de uma limpeza:

git gc --prune=now

ou você pode estar precisando de uma ameixa seca:

git remote prune public

ameixa seca

Exclui todos os ramos de rastreamento obsoletos em <name>. Essas ramificações antigas já foram removidas do repositório remoto referenciado por <name>, mas ainda estão disponíveis localmente em "remotes / <name>".

Com a opção --dry-run, relate quais ramificações serão removidas, mas, na verdade, não podem ser removidas.

No entanto, parece que eles deveriam ter sido limpos anteriormente com

git remote rm public 

rm

Remova o controle remoto chamado <name>. Todas as ramificações de rastreamento remoto e as definições de configuração do controle remoto são removidas.

Portanto, pode ser que você tenha editado manualmente o arquivo de configuração e isso não ocorreu, ou você tem problemas de privilégio.

Talvez execute isso de novo e veja o que acontece.


Contexto do Conselho

Se você der uma olhada nos logs de revisão , notará que sugeri técnicas mais "corretas", que por qualquer motivo não quisessem trabalhar em seu repositório.

Suspeitei que o OP tivesse feito algo que deixasse sua árvore em um estado inconsistente, o que fez com que ele se comportasse um pouco estranhamente, e que git gcera necessário consertar a esquerda para trás da crosta.

Geralmente, git branch -rd origin/badbranch é suficiente para ativar uma ramificação de rastreamento local ou git push origin :badbranchativar uma ramificação remota e, geralmente, você nunca precisará chamargit gc


4
Não quero excluir a ramificação no lado remoto. Eu acho que há uma diferença sutil.
Cmcginty 02/07/2009

2
er, a pergunta está efetivamente perguntando "como faço para excluir uma filial remota". Isso é o que são esses caminhos.
49750 Kent Kentric

1
Vou reformular o assunto, se isso tornar mais claro o que estou perguntando, mas o comando mostra exatamente qual é o meu problema.
Cmcginty 02/07/2009

40
git gcnão é necessário aqui, mas git remote pruneme faz sentir mais seguro do que excluir manualmente as coisas git branch -rd, já que o git está verificando quais ramificações remotas são feitas.
Mike Seplowitz

3
isso não funcionou para mim - o 'git branch -rd' funcionou bem, no entanto.
Dsummersl

683

Tudo que você precisa fazer é

git fetch -p

Ele removerá todos os seus ramos locais que são excluídos remotamente.

Se você estiver no git 1.8.5+, poderá configurá-lo automaticamente

git config fetch.prune true

ou

git config --global fetch.prune true

7
Era isso que eu também procurava - a questão é descrever um cenário mais complicado que o comum.
Rjmunro 06/12/12

22
Estou procurando uma maneira de excluir filiais locais onde o controle remoto correspondente foi excluído, mas isso não funciona para mim. Alguma idéia do porquê?
31413 jackocnr

11
Isso remove as ramificações listadas em remoto / origem, mas não exclui ramificações de rastreamento local, o que é igualmente importante.
precisa saber é o seguinte

@ Cupcake Como você não reverteu minha primeira edição (que estava corrigindo as informações incorretas sobre o Git 1.8.5+), agora você fez isso incorreto. Minha segunda edição foi consertar o que eu coloquei que estava incorreto, que agora está lá novamente (com sua reversão). Vá em frente e role mais uma edição para ter o original. Obrigado.
Ferventcoder

@ferventcoder Eu verifiquei sua última edição e revirei para ela. O OP pode reverter novamente se ele não gostar. Obrigado.

319
git push public :master

Isso excluiria o ramo remoto chamado master como Kent Fredric apontou.

Para listar ramificações de rastreamento remoto:

git branch -r

Para excluir uma ramificação de rastreamento remoto:

git branch -rd public/master

6
Isso me ajudou a remover um ramo fantasma remoto do git-svn.
Nick

9
git branch -rd removed_remote/branchtrabalhou para mim, enquanto o git gc --prune=nowfoi inútil.
Rchampourlier 28/11

2
Consegui usar git prunesem problemas, mas meu colega de trabalho que bifurcou nosso repositório principal ** PODERIA SOMENTE ** usar a git branch -rd public/mastersolução -style para limpar seu ambiente.
Abel

3
git branch -rd public/masterera o que estava faltando. Eu tinha heroku/mastere herkou/master... lol woops
Aaron

@rchampourlier Não é 100% inútil - se o seu repositório git for grande, remover as ramificações não utilizadas poderá liberar muito espaço em disco em algumas situações.
peterh - Restabelece Monica

159

Tudo que você precisa fazer é

$ git branch -rd origin/whatever 

É simples assim. Não há motivo para chamar um GC aqui.


1
como você "envia" essa exclusão para o github?
Thufir

14
@ Thufir Não é sobre isso que se trata. Esta pergunta foi especificamente para situações em que você tem uma referência remota inválida no repositório local, mas essa ramificação não existe mais no servidor remoto. A resposta à sua pergunta é de R $ git push origin: qualquer que seja
jpswain

Sim, se algo acontecer no repositório remoto em que uma ramificação é excluída, mas você ainda tiver referência a essa ramificação remota na sua máquina local, será necessário fazer o que eu coloquei na minha resposta original para limpá-la.
Jspwain #

6
Se você tiver um grande trabalho de limpeza (muitos controles remotos pendentes), poderá excluir todas as ramificações remotas com algo como, em git branch -rd $(git branch -r)seguida, restabelecer as válidas fazendo uma busca.
Nobar

Minha situação era que eu costumava git config -erenomear meu controle remoto. Renomeei o controle remoto minepara origin. Então, essa foi a solução que funcionou melhor para mim:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now não é o que você quer.

git remote prune public

ou git remote prune origin# se for a fonte remota

é o que você quer


6
O @Casey $ git gc # gosta de desfragmentar os arquivos git para acelerar a origem da remoção remota do repositório $ git # limpará a exclusão das ramificações remotas obsoletas que aparecem com "git branch -r | grep origin". Isso é o que a pergunta está fazendo, eu acredito. Portanto, os comandos são totalmente diferentes.
tongueroo

29

A resposta aceita não funcionou para mim quando o juiz foi empacotado. Isso, no entanto:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Trabalhou para mim. O git branch regular -d não estava funcionando, retornou o erro de que o branch não existe, porque eu removi a origem chamada "original", criada por engano, diretamente no arquivo .git / config.
micrub

Este é o método que eu tive que usar para remover ramificações que foram inadvertidamente omitidas do meu .git / config (que precisou ser reconstruído devido a uma corrupção não relacionada). É uma pena que esta resposta esteja tão distante da cadeia que eu não a notei até que finalmente encontrei a solução e fui adicioná-la à resposta aceita!
Taranaki

Era disso que eu precisava depois de usar o svn2git. Havia muitos remotes / svn / * branches. Teve que criar um controle remoto 'svn' falso primeiro.
21817 Sam Sam

7

No meu caso, eu estava tentando excluir as entradas salvas .git/packed-refs. Você pode editar esse arquivo de texto sem formatação e excluir entradas quegit br -D não sabem como tocar (pelo menos na versão 1.7.9.5).

Encontrei esta solução aqui: https://stackoverflow.com/a/11050880/1695680


uau, isso me ajudou. O meu colega tentou, reiniciar VS, Reiniciar seu computador nada funcionou, ele apagado seu local de repo e puxar tudo para se livrar deste :)
Esen

1
Hoje, eu me inclinei para a conclusão de que esse arquivo compactado-refs é criado como parte git gc. Quando ele compacta seus commits em um arquivo compactado, ele também moveu as referências para um único arquivo de texto sem formatação, possivelmente para fins de otimização; Espero que as versões futuras do git possam git br -D ...embalar referências.
ThorSummoner


3

Como eu não sabia git branch -rd, a maneira como resolvi problemas como esse é tratar meu repositório como um repositório remoto e fazer uma exclusão remota. git push . :refs/remotes/public/master. Se as outras formas não funcionarem e você tiver alguma referência estranha da qual deseja se livrar, essa maneira crua é infalível. Ele fornece a precisão exata para remover (ou criar!) Qualquer tipo de referência.


2

Apenas um pouco relacionado, mas ainda assim pode ser útil na mesma situação que tínhamos - usamos um compartilhamento de arquivos de rede para nosso repositório remoto. Na semana passada, as coisas estavam funcionando, esta semana estávamos recebendo o erro "Origem remota não anunciava referência para refs / cabeças / mestre da filial. Essa referência pode não existir no controle remoto ou pode estar oculta pelas configurações de permissão"

Mas acreditávamos que nada havia sido feito para corromper as coisas. O NFS faz instantâneos, então revisei cada "versão anterior" e vi que três dias atrás, o tamanho em MB do repositório havia passado de 282MB para 33MB, e agora existiam cerca de 1.403 novos arquivos e 300 pastas. Eu perguntei aos meus colegas de trabalho e um deles tentou dar um empurrão naquele dia - depois o cancelou.

Usei a funcionalidade "Restaurar" do NFS para restaurá-la imediatamente antes dessa data e agora tudo está funcionando bem novamente. Eu tentei a ameixa anteriormente, não parecia ajudar. Talvez as limpezas mais severas tivessem funcionado.

Espero que isso possa ajudar alguém mais um dia!

Jay


2

Eu tive um problema parecido. Nenhuma das respostas ajudou. No meu caso, eu tinha dois repositórios remotos removidos aparecendo permanentemente.

Minha última idéia foi remover todas as referências à mão.

Digamos que o repositório se chame "Repo". Eu fiz:

find .git -name Repo 

Portanto, excluí os arquivos e diretórios correspondentes da pasta .git ( essa pasta pode ser encontrada no aplicativo Rails ou no computador https://stackoverflow.com/a/19538763/6638513 ).

Então eu fiz:

grep Repo -r .git

Isso encontrou alguns arquivos de texto nos quais eu removi as linhas correspondentes. Agora, tudo parece estar bem.

Normalmente, você deve deixar esse trabalho para o git.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.