Comment supprimer une référence de branche distante non valide de Git?

731

Dans mon référentiel actuel, j'ai la sortie suivante:

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

Je souhaite supprimer remotes/public/masterde la liste des succursales:

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

De plus, la sortie de git remoteest étrange, car elle ne répertorie pas public:

$ git remote show 
origin

Comment puis-je supprimer «télécommandes / public / maître» de la liste des succursales?

Mettre à jour, essayé la git pushcommande:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
la source
31
A fonctionné git remote prune [remote-name]ou git fetch -p [remote-name]non dans votre scénario? Le faire avec git gcest beaucoup plus énergique que ce qui est normalement nécessaire.
rjmunro
6
git remote prune [remote-name]ne fonctionnera pas avec git svn, bien que git gc... git branch -rd origin/namene fonctionne pas cependant. @Casey, vous devriez probablement sélectionner la deuxième réponse - c'est un peu moins dangereux.
naught101
4
J'adore cette question.
Revenant
2
Pour éviter une erreur de gitter n00b à l'avenir, je recommande d'utiliser un exemple de branche différent de master... en particulier lors de la suppression sur la télécommande.
absynce

Réponses:

743

Vous pourriez avoir besoin d'un nettoyage:

git gc --prune=now

ou vous pourriez avoir besoin d'un pruneau:

git remote prune public

prune

Supprime toutes les branches de suivi périmées sous <nom>. Ces branches périmées ont déjà été supprimées du référentiel distant référencé par <nom>, mais sont toujours disponibles localement dans "télécommandes / <nom>".

Avec l'option --dry-run, indiquez quelles branches seront élaguées, mais ne les élaguez pas réellement.

Cependant, il semble que ceux-ci auraient dû être nettoyés plus tôt avec

git remote rm public 

rm

Supprimez la télécommande nommée <nom>. Toutes les branches de suivi à distance et les paramètres de configuration de la télécommande sont supprimés.

Il se peut donc que vous ayez modifié manuellement votre fichier de configuration et que cela ne se soit pas produit, ou que vous ayez des problèmes de privilèges.

Peut-être recommencez et voyez ce qui se passe.


Contexte des conseils

Si vous jetez un œil dans les journaux de révision , vous remarquerez que j'ai suggéré des techniques plus «correctes» qui, pour une raison quelconque, ne voulaient pas travailler sur leur référentiel.

Je soupçonnais que le PO avait fait quelque chose qui laissait leur arbre dans un état incohérent qui le faisait se comporter un peu étrangement, et git gcétait obligé de réparer la gauche derrière.

git branch -rd origin/badbranchEst généralement suffisant pour neutraliser une branche de suivi locale ou git push origin :badbranchpour nuquer une branche distante, et vous n'aurez généralement jamais besoin d'appelergit gc

Kent Fredric
la source
4
Je ne veux pas supprimer la branche du côté distant. Je pense qu'il y a une différence subtile.
cmcginty
2
euh, la question est effectivement de savoir "comment supprimer une branche distante". C'est ce que sont ces chemins.
Kent Fredric
1
Je reformulerai le sujet si cela rend plus clair ce que je demande, mais la commande montre exactement quel est mon problème.
cmcginty
40
git gcn'est pas nécessaire ici, mais git remote pruneje me sens plus en sécurité que de supprimer manuellement des choses avec git branch -rd, car git vérifie quelles branches distantes sont effectuées.
Mike Seplowitz
3
cela n'a pas fonctionné pour moi - la 'git branch -rd' a bien fonctionné, cependant.
dsummersl
683

Tout ce que vous devez faire c'est

git fetch -p

Il supprimera toutes vos succursales locales qui sont supprimées à distance.

Si vous utilisez git 1.8.5+, vous pouvez le régler automatiquement

git config fetch.prune true

ou

git config --global fetch.prune true
Pawan Maheshwari
la source
7
C'est aussi ce que je cherchais - la question décrit un scénario plus compliqué que le commun.
rjmunro
22
Je cherche un moyen de supprimer les branches locales où la télécommande correspondante a été supprimée, mais cela ne fonctionne pas pour moi. Une idée pourquoi?
jackocnr
11
Cela supprime les branches répertoriées dans remote / origin mais ne supprime pas les branches de suivi locales, ce qui est tout aussi important.
BlueRaja - Danny Pflughoeft
@Cupcake Puisque vous n'avez pas annulé ma première modification (qui corrigeait les informations incorrectes sur Git 1.8.5+), vous avez maintenant rendu cela incorrect. Ma deuxième modification consistait à corriger ce que je mettais qui était incorrect, qui est maintenant là encore (avec votre restauration). Veuillez continuer et annuler une autre modification pour obtenir l'original. Merci.
ferventcoder
@ferventcoder J'ai revérifié votre dernière modification et y suis revenu. L'OP peut revenir en arrière s'il ne l'aime pas. Merci.
319
git push public :master

Cela supprimerait la branche distante nommée mastercomme Kent Fredric l'a souligné.

Pour répertorier les branches de suivi à distance:

git branch -r

Pour supprimer une branche de suivi à distance:

git branch -rd public/master
Alan Haggai Alavi
la source
6
Cela m'a aidé à supprimer une branche fantôme distante git-svn.
Nick
9
git branch -rd removed_remote/branchtravaillé pour moi, alors que le git gc --prune=nowétait sans valeur.
rchampourlier
2
J'ai pu l'utiliser git prunesans aucun problème, mais mon collègue qui a bifurqué notre dépôt principal ** POURRAIT SEULEMENT ** utiliser la git branch -rd public/mastersolution -style pour nettoyer son environnement.
Abel
3
git branch -rd public/masterc'est ce qui me manquait. J'avais heroku/masteret herkou/master... lol woops
Aaron
@rchampourlier Pas 100% sans valeur - si votre dépôt git est gros, la suppression des branches inutilisées peut libérer beaucoup d'espace disque dans certaines situations.
peterh
159

Tout ce que vous devez faire c'est

$ git branch -rd origin/whatever 

C'est si simple. Il n'y a aucune raison d'appeler un GC ici.

jpswain
la source
1
comment "pousser" cette suppression vers github?
Thufir
14
@Thufir Ce n'est pas de cela qu'il s'agissait. Cette question concernait spécifiquement les situations où vous avez une référence distante non valide dans le référentiel local, mais cette branche n'existe plus sur le serveur distant. La réponse à votre question est $ git push origin:
any
Oui, si quelque chose se produit sur le référentiel distant où une branche est supprimée, mais que vous avez toujours une référence à cette branche distante sur votre machine locale, vous devrez alors faire ce que j'ai mis dans ma réponse d'origine pour la nettoyer.
jpswain
6
Si vous avez un gros travail de nettoyage (beaucoup de télécommandes pendantes), vous pouvez simplement supprimer toutes les branches distantes avec quelque chose comme git branch -rd $(git branch -r)puis rétablir les valides en faisant une extraction.
nobar
Ma situation était que j'avais utilisé git config -epour renommer ma télécommande. J'ai renommé la télécommande mineen origin. Ensuite, c'est la solution qui a fonctionné le mieux pour moi:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu
70

git gc --prune=now n'est pas ce que tu veux.

git remote prune public

ou git remote prune origin# si c'est la source distante

est ce que tu veux

tongueroo
la source
6
@Casey $ git gc # fait comme une défragmentation pour les fichiers git pour accélérer le respository $ git remote prune origin # nettoiera la suppression des branches distantes périmées qui apparaissent avec "git branch -r | grep origin". C'est ce que la question demande, je crois. Ainsi, les commandes sont totalement différentes.
tongueroo
29

La réponse acceptée n'a pas fonctionné pour moi lorsque la référence a été emballée. Cependant, cela:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
chris
la source
A travaillé pour moi. La branche git régulière -d ne fonctionnait pas, a renvoyé une erreur indiquant que la branche n'existe pas, car j'ai supprimé l'origine appelée "original", créée par erreur, directement dans le fichier .git / config.
micrub
C'est la méthode que j'ai dû utiliser pour supprimer les branches qui ont été omises par inadvertance de mon .git / config (qui ont dû être reconstruites en raison d'une corruption non liée). C'est dommage que cette réponse soit si loin dans la chaîne que je ne l'ai pas remarqué jusqu'à ce que finalement je trouve la solution et que je l'ajoute à la réponse acceptée!
taranaki
C'est ce dont j'avais besoin après avoir utilisé svn2git. Il y avait beaucoup de branches distantes / svn / *. J'ai d'abord dû créer une fausse télécommande 'svn'.
Sam
7

Dans mon cas, j'essayais de supprimer les entrées enregistrées .git/packed-refs. Vous pouvez modifier ce fichier texte brut et en supprimer les entréesgit br -D ne savent pas comment toucher (au moins dans la version 1.7.9.5).

J'ai trouvé cette solution ici: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
la source
wow, cela m'a aidé. Mon collègue a essayé, redémarrer VS, redémarrer son ordinateur, rien ne fonctionnait, il a supprimé son dépôt local et tout tirer pour s'en débarrasser :)
Esen
1
Aujourd'hui, j'ai appris que ce fichier compressé-refs est créé dans le cadre de git gc, quand il compresse vos commits dans une archive hautement compressée, il a également déplacé les références dans un seul fichier texte brut, peut-être à des fins d'optimisation; J'espère que les futures versions de git pourront git br -D ...contenir des références.
ThorSummoner
3

Je ne le savais pas git branch -rd, donc la façon dont j'ai résolu des problèmes comme celui-ci est de traiter mon référentiel comme un référentiel distant et de faire une suppression à distance. git push . :refs/remotes/public/master. Si les autres façons ne fonctionnent pas et que vous avez une référence étrange dont vous voulez vous débarrasser, cette façon brute est infaillible. Il vous donne la précision exacte pour supprimer (ou créer!) Tout type de référence.

clacke
la source
2

Seulement légèrement liés, mais pourraient être utiles dans la même situation que nous - nous utilisons un partage de fichiers réseau pour notre référentiel distant. La semaine dernière, les choses fonctionnaient, cette semaine, nous recevions l'erreur "L'origine à distance n'a pas annoncé la référence pour les références de branche / têtes / maître. Cette référence peut ne pas exister dans la télécommande ou peut être masquée par les paramètres d'autorisation"

Mais nous pensions que rien n'avait été fait pour corrompre les choses. Le NFS fait des instantanés, j'ai donc passé en revue chaque "version précédente" et j'ai vu qu'il y a trois jours, la taille en Mo du référentiel était passée de 282 Mo à 33 Mo, et environ 1403 nouveaux fichiers et 300 dossiers existaient désormais. J'ai interrogé mes collègues et l'un d'entre eux avait essayé de faire un effort ce jour-là - puis l'avait annulé.

J'ai utilisé la fonctionnalité "Restauration" de NFS pour la restaurer juste avant cette date et maintenant tout fonctionne à nouveau correctement. J'ai essayé le pruneau auparavant, ne semblait pas aider. Peut-être que les nettoyages plus durs auraient fonctionné.

J'espère que cela pourrait aider quelqu'un d'autre un jour!

Geai

JGlass
la source
2

J'avais un problème similaire. Aucune des réponses n'a aidé. Dans mon cas, j'avais deux référentiels distants supprimés apparaissant en permanence.

Ma dernière idée était de supprimer toutes les références à la main.

Disons que le référentiel s'appelle «Repo». J'ai fait:

find .git -name Repo 

J'ai donc supprimé les fichiers et répertoires correspondants du dossier .git ( ce dossier se trouvait dans votre application Rails ou sur votre ordinateur https://stackoverflow.com/a/19538763/6638513 ).

Ensuite, j'ai fait:

grep Repo -r .git

Cela a trouvé des fichiers texte dans lesquels j'ai supprimé les lignes correspondantes. Maintenant, tout semble aller bien.

Habituellement, vous devriez quitter ce travail pour git.

Keinstein
la source