web-dev-qa-db-fra.com

git remote Prune Origin ne supprime pas la branche locale même si sa branche distante en amont est supprimée

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>`
12
saketrp

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 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:

Cette dernière option est floconneuse:

  • Je préfère utiliser git branch -d au lieu de -D, afin de ne supprimer que les branches déjà fusionnées.
  • vous pourriez finir par supprimer des branches avec un message de validation contenant la chaîne ": gone"

A la meilleure façon de lister ces branches est :

git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"
10
VonC