818 votes

Comment supprimer une référence de branche distante invalide dans Git ?

Dans mon repo actuel, j'ai le résultat suivant :

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

Je veux supprimer remotes/public/master de la liste des branches :

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

De même, la sortie de git remote est étrange, puisqu'il n'énumère pas public :

$ git remote show 
origin

Comment puis-je supprimer 'remotes/public/master' de la liste des branches ?

Mise à jour, j'ai essayé le git push commandement :

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

41 votes

Est-ce que git remote prune [remote-name] o git fetch -p [remote-name] ne fonctionne pas dans votre scénario ? En le faisant avec git gc est beaucoup plus énergique que ce qui est normalement nécessaire.

7 votes

git remote prune [remote-name] ne fonctionnera pas avec git svn, mais pas non plus avec git gc ... git branch -rd origin/name fonctionne cependant. @Casey, vous devriez probablement choisir la deuxième réponse - c'est légèrement moins dangereux.

4 votes

J'adore cette question. Je reviens presque tous les mois

810voto

Kent Fredric Points 35592

Vous avez peut-être besoin d'un nettoyage :

git gc --prune=now

ou vous pourriez avoir besoin d'un pruneau :

git remote prune public

pruneau

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 "remotes/<nom>".

Avec l'option --dry-run, les branches à élaguer sont signalées, mais elles ne sont pas élaguées.

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

git remote rm public 

rm

Supprimez la branche distante nommée <nom>. Toutes les branches de suivi à distance et les paramètres de configuration pour le distant sont supprimés.

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

Peut-être qu'il faut recommencer et voir ce qui se passe.


Contexte des conseils

Si vous jetez un coup d'œil à la journaux de révision Vous remarquerez que j'ai suggéré des techniques plus "correctes", qui, pour une raison ou une autre, n'ont pas voulu fonctionner sur leur référentiel.

Je soupçonne que l'OP a fait quelque chose qui a laissé son arbre dans un état incohérent qui a causé un comportement un peu étrange, et git gc était nécessaire pour réparer les restes.

Habituellement git branch -rd origin/badbranch est suffisant pour détruire une branche de suivi locale, ou bien git push origin :badbranch pour détruire une branche distante, et généralement vous nunca besoin d'appeler git gc

5 votes

Je ne veux pas supprimer la branche du côté distant. Je pense qu'il y a une différence subtile.

2 votes

En fait, la question est "comment supprimer une branche distante". C'est ce que sont ces chemins.

1 votes

Je reformulerai le sujet si cela rend plus clair ce que je demande, mais la commande montre exactement quel est mon problème.

753voto

Pawan M Points 4396

Tout ce que vous devez faire, c'est

git fetch -p

Cela supprimera toutes vos branches locales qui sont supprimées à distance.

Si vous êtes sous git 1.8.5+, vous pouvez régler cela automatiquement.

git config fetch.prune true

ou

git config --global fetch.prune true

10 votes

C'est ce que je cherchais également - la question décrit un scénario plus compliqué que le scénario habituel.

25 votes

Je cherche un moyen de supprimer les branches locales lorsque la branche distante correspondante a été supprimée, mais cela ne fonctionne pas pour moi. Une idée de la raison ?

13 votes

Cela supprime les branches listées dans remote/origin mais ne supprime pas les branches de suivi locales, ce qui est tout aussi important.

341voto

Alan Haggai Alavi Points 34260
git push public :master

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

Pour lister les branches de suivi à distance :

git branch -r

Pour supprimer une branche de suivi à distance :

git branch -rd public/master

7 votes

Cela m'a aidé à supprimer une branche fantôme distante de git-svn.

12 votes

git branch -rd removed_remote/branch a fonctionné pour moi, tandis que le git gc --prune=now était sans valeur.

2 votes

J'ai pu utiliser git prune sans aucun problème, mais mon collègue qui a bifurqué de notre dépôt principal **COULD SEULEMENT** utilise la version git branch -rd public/master -pour nettoyer son environnement.

173voto

orange80 Points 5822

Tout ce que vous devez faire est

$ git branch -rd origin/whatever 

C'est aussi simple que cela. Il n'y a pas de raison d'appeler un gc ici.

1 votes

Comment "pousser" cette suppression vers github ?

17 votes

@Thufir Ce n'est pas le sujet de la question. Cette question concernait spécifiquement les situations dans lesquelles vous avez une référence distante invalide dans le repo local, mais cette branche n'existe plus sur le serveur distant. La réponse à votre question est $ git push origin :whatever

0 votes

Oui, si quelque chose se passe sur le repo distant où une branche est supprimée, mais que vous avez toujours une référence à cette branche distante sur votre machine locale, alors vous devrez faire ce que j'ai mis dans ma réponse originale pour le nettoyer.

73voto

tongueroo Points 611

git gc --prune=now n'est pas ce que vous voulez.

git remote prune public

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

c'est ce que vous voulez

6 votes

@Casey $ git gc # fait comme une défragmentation des fichiers git pour accélérer le dépôt $ git remote prune origin # va nettoyer et supprimer les branches distantes périmées qui apparaissent avec "git branch -r | grep origin". C'est ce que la question demande, je crois. Donc, les commandes sont totalement différentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X