Ceci est un cas d'utilisation courant pour moi, je clone un référentiel, extrait une branche, fais quelques modifications de code, effectue plusieurs validations, puis lorsque sa stabilité, je fais un Push to remote, finalement la branche est fusionnée et supprimée. et je suis parti avec une branche locale avec en amont disparu.
Je cherchais un moyen sûr de supprimer toutes ces branches. d'après la description, il semblait que git remote Prune Origin faisait exactement cela. Mais cela ne semble pas fonctionner pour moi.
En voyant le comportement suivant, la branche encrdb_init
A été supprimée de remote
mais la commande git remote Prune Origin
Ne semble pas la tailler. Je ne suis pas sûr pourquoi.
$ git branch
bugfix/encrdb_init
* master
$
$ git remote Prune Origin
$
$ git checkout bugfix/encrdb_init
Switched to branch 'bugfix/encrdb_init'
Your branch is based on 'Origin/bugfix/encrdb_init', but the upstream
is gone.
(use "git branch --unset-upstream" to fixup)
$
$ git branch
bugfix/encrdb_init <<< shouldn't this have been pruned?
* master
pour référence en ajoutant la sortie de git remote show Origin
$ git remote show Origin
* remote Origin
Fetch URL: <redacted>
Push URL: <redacted>
HEAD branch: master
Remote branches:
SSL_test tracked
addNodeFix tracked
autoprefix tracked
release/1.0.2 tracked
Local branches configured for 'git pull':
bugfix/encrdb_init merges with remote bugfix/encrdb_init
master merges with remote master
release/1.0.2 merges with remote release/1.0.2
Local refs configured for 'git Push':
master pushes to master (up to
date)
release/1.0.2 pushes to release/1.0.2 (up to
date)
$ git branch -vv
* bugfix/encrdb_init 341a078c [Origin/bugfix/encrdb_init: gone] <redacted comment>`
La commande git remote Prune
supprime uniquement les branches de suivi à distance dans l'espace de noms remotes/Origin
.
Pas les succursales locales.
La pratique habituelle est de supprimer uniquement fusionné branches locales .
git branch (même avec -vv) n'affiche que les branches local.
A la branche peut avoir une barre oblique dans son nom
Une branche de suivi à distance se trouve dans l'espace de noms remotes/Origin
Et enregistre ce qui a été récupéré.
An branche amont est une branche distante associée à une branche locale pour que ladite branche locale sache où pour pousser.
git remote Prune supprime correctement la branche de suivi à distance, qui se trouve être la branche amont de la branche locale bugfix/encrdb_init
.
C'est pourquoi vous voyez Origin/bugfix/encrdb_init: gone
: La branche de suivi à distance a disparu.
L'OP ajoute:
d'après la description, il semblait que
git remote Prune Origin
faisait exactement cela. Mais cela ne semble pas fonctionner pour moi.
Non, la description ne mentionne pas les succursales locales.
Supprime toutes les branches de suivi à distance périmées sous
<name>
.
Ces branches périmées ont déjà été supprimées du référentiel distant référencé par<name>
, Mais sont toujours disponibles localement dans "remotes/<name>
".
<name>
Voici le nom du repo remote référencé par git remote -v.
Généralement "Origin
".git remote Prune
Supprimera les branches enregistrées dans remotes/Origin
(Pas les "télécommande (s)"). Il ne supprimera pas les succursales locales.
Pour supprimer "en toute sécurité" les succursales locales, vous devez:
soit considéré comme ceux qui sont fusionnés localement , par exemple fusionné à master
:
git fetch -p && git branch -d $(git branch master --merged | grep master -v)
ou, si vous voulez vraiment supprimez immédiatement celle dont la branche amont est "partie" :
git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done
Cette dernière option est floconneuse:
: gone
"A la meilleure façon de lister ces branches est :
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"