web-dev-qa-db-fra.com

Supprimer les branches Git locales après les avoir supprimées sur le référentiel distant

Je souhaite que mes référentiels locaux et distants soient toujours synchronisés en termes de branches.

Après un examen de la demande d'extraction sur GitHub, je fusionne et supprime ma branche (distante). Comment puis-je récupérer ces informations dans mon référentiel local et obtenir que Git supprime également ma version locale de la branche?

157
sf89

Le moyen rapide

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

NB: si vous n'êtes pas sur master, cela peut potentiellement supprimer la branche. Continuez à lire pour le "meilleur moyen".

Assurez-vous de garder le maître

Vous pouvez vous assurer que master, ou toute autre branche, ne soit pas supprimé par greping pour plus d'informations. Dans ce cas, vous iriez:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Donc si nous voulions garder master, develop et staging par exemple, nous irions:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

Faites-en un alias

Comme il est un peu long, vous voudrez peut-être ajouter un alias à votre .zshrc ou .bashrc. Le mien s'appelle gbpurge (pour git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

Rechargez ensuite votre .bashrc ou .zshrc:

. ~/.bashrc

ou

. ~/.zshrc
176
sf89

J'utilise le même flux avec GitHub, et les réponses précédentes ne me satisfaisaient pas, car git branch --merged répertorie les branches qui ont été fusionnées, mais toutes n'ont pas été supprimées à distance dans mon cas. Donc, cela a fonctionné pour moi:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

où:

  • git fetch --all -p: met à jour le statut des branches locales
  • git branch -vv: liste le statut des branches locales
  • grep ": gone]": filtre les effacés
  • awk '{ print $1 }': extraire leurs noms
  • xargs -n 1 git branch -d: donne le nom à la commande de suppression

Remarque: si vous préférez, vous pouvez utiliser -D au lieu de -d, qui applique la suppression.

Par exemple:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
Origin
playground-for-tests
test-services
remotes/Origin/HEAD -> Origin/master
remotes/Origin/basic-testing
remotes/Origin/master
remotes/Origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching Origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
Origin
test-services
remotes/Origin/HEAD -> Origin/master
remotes/Origin/basic-testing
remotes/Origin/master
remotes/Origin/test-services

Référence:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

76
Alessio

essayer:

 git pull --Prune 

qui supprime votre branche locale, si la branche distante correspondante est supprimée.

Mis à jour:

L'affirmation ci-dessus n'est pas correcte.

En fait, exécuter git pull --Prune va ne supprime que les branches de suivi à distance comme

 télécommandes/Origine/fff 
 télécommandes/Origine/dev 
 télécommandes/Origine/maître 

Ensuite, vous pouvez exécuter git branch -r pour vérifier les branches de suivi à distance laissées sur votre ordinateur. Supposons que les branches de gauche sont:

 Origine/dev 
 Origine/maître 

ce qui signifie que la branche Origin/fff est supprimée.

Donc, après avoir lancé git pull --Prune, lancez simplement:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

vous pouvez trouver toutes les branches locales qui:

  1. ne plus avoir de branches distantes correspondantes;
  2. peut être enlevé en toute sécurité.

alors, <the command above> | xargs git branch -d peut tous les supprimer.

71
nicky_zs

Ceci devrait permettre d'éviter de supprimer les branches master et development avec la solution acceptée:

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
23
Intrepid

Pour les personnes utilisant powershell, ceci est l'équivalent de la réponse ci-dessus :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. Filtrer toutes les branches marquées comme disparues
  2. Appelez git branch -D sur chacune des branches trouvées
14
amaechler

Rien de tout cela ne fonctionnait pour moi. Vous pouvez voir mon autre réponse ici: https://stackoverflow.com/a/34969726/550454

Mais essentiellement, j'ai maintenant ceci dans mon ~/.gitconfig:

[alias]
  Prune-branches = !git remote Prune Origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
5
Karl Wilbur

Solution très simple: supprimez votre dépôt local et clonez à nouveau le distant. Cela ne semble pas très élégant, mais c’est simple et vous comprendrez exactement ce que vous faites sans lire les pages de manuel :-).

5
Mark van der Loo

Je fais juste cela pour supprimer les branches locales fusionnées:

git branch -d $(git branch --merged)

et si vous souhaitez également supprimer les suivis inexistants:

git pull --Prune
2
alacambra

J'ai écrit cette liste pour répertorier toutes les branches locales qui n'ont pas de branche distante correspondante:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..Origin\///')|tail -n +4|sed -n "s/^-//p" -

Ceci fait, il est facile de supprimer ces branches locales avec xargs:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..Origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
1
ks1322

Dans le cas où vous venez de pousser et de fusionner votre branche en maître, procédez comme suit dans git bash:

git branch -d branch_name_to_delete

Si vous êtes actuellement dans cette branche, il vous repoussera à maîtriser. À ce stade, faites un pull avec

git pull
0
Joshua Schlichting