88 votes

Supprimer les anciennes branches distantes de Git

Lorsque j'utilise l'autocomplétion bash dans Git, il continue à me montrer des branches d'anciennes remotes que je n'ai plus. Lorsque je fais un git branch -la il montre ces vieilles télécommandes et branches tandis qu'un git branch -l ne le fera pas. A ls .git/refs/remotes/ les montre aussi. Cependant, ils ne sont pas présents dans mon .git/config et ils ne sont pas non plus affichés lorsque je lance git remote show .

Alors comment puis-je m'en débarrasser parce que ma liste de complétion automatique est trop longue en ce moment.

J'ai déjà essayé :

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Je suis également conscient du fait que je peux simplement re-cloner le dépôt mais c'est de la triche ;-)

149voto

sleske Points 29978

Git ne supprime pas automatiquement les branches (locales) de suivi à distance si la branche a été supprimée dans le dépôt distant. De plus, avant la version V2.0.1, les branches de suivi à distance n'étaient parfois pas supprimées lorsque vous supprimiez le dépôt distant de votre configuration git (voir la réponse de VonC).

Pour supprimer les branches de suivi à distance périmées (branches qui ont été supprimées dans le référentiel distant) pour l'un de vos référentiels distants, exécutez

git remote prune <remote>

Pour citer la page de manuel ou git remote :

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/<name>".

Avec l'option --dry-run, rapporte les branches qui seront élaguées, mais fait mais ne les élague pas réellement.

Cependant, d'après votre question, il semble que vous ayez supprimé manuellement .git/refs/remotes/theoldremote Git ne connaît donc plus le référentiel distant auquel appartenaient les branches de suivi à distance. Ce n'est pas comme ça qu'il faut faire.

La manière normale de supprimer un référentiel distant est d'exécuter

git remote rm <remote>

Cela va retirer la télécommande de votre .git/config et supprimera les branches de suivi à distance.

Si vous supprimez simplement le répertoire sous .git/refs/remotes/ les branches resteront derrière. Vous devrez alors les enlever manuellement :

git branch -rd <remote>/<branchname>

Vous avez besoin de l'option -r pour supprimer une branche distante.

16voto

Mert Points 2421

J'utilise

git push origin :remote_branch

pour supprimer une branche du serveur.

git remote prune origin

pour supprimer les références distantes qui n'existent plus sur le serveur

6voto

VonC Points 414372

Note : bien que git remote prune soit la réponse, sachez que, à partir de git 2.0.1 (25 juin 2014), une git remote rm commence par supprimer les branches de suivi à distance .
Ainsi, avec un peu de chance, on ne devrait pas avoir à nettoyer les vieilles branches après un git remote rm .

Véase commettre b07bdd3 par Jens Lindström ( jensl )

remote rm : supprimer la configuration à distance en tant que dernière

Lors de la suppression d'une télécommande, supprimez les branches de suivi de la télécommande avant de supprimer la configuration de la télécommande.
De cette façon, si l'opération échoue ou est interrompue pendant la suppression des branches de suivi à distance, la commande peut être réexécutée pour terminer l'opération. .


Mais si vous devez le faire, un simple git fetch peut suffire, à condition de l'avoir fixé au préalable :

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true

5voto

aragaer Points 3518

Pousser rien à une branche pour la supprimer :

git push remote :remote_branch

C'est quelque part dans la documentation mais ce n'est pas vraiment évident.

Ou ai-je mal compris votre question ?

4voto

Alex Points 678

Ok, je l'ai. Le problème était que les remotes n'existent plus, mais ils existent quelque part dans la base de données git. J'ai ré-adjoint les remotes, puis j'ai fait

git remote prune theremote
git remote rm theremote
git gc --prune=now

Après cela, ils disparaissent de la liste. Je suppose que je ne les ai pas supprimés correctement auparavant.

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