Supprimer les twigs Git locales après les avoir supprimées sur le repository à distance

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

Après un examen de la requête Pull sur GitHub, je fusionne et supprime ma twig (remote). Comment pourrais-je récupérer ces informations dans mon référentiel local et demander à Git de supprimer également ma version locale de la twig?

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 twig. Continuez à lire pour la “meilleure façon”.

Assurez-vous de garder le maître

Vous pouvez vous assurer que le master , ou toute autre twig, ne soit pas supprimé par un plus grand nombre de grep . 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 restr master , develop et develop 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 c’est un peu long, vous voudrez peut-être append un alias à votre .zshrc ou .bashrc . Le mien s’appelle gbpurge (pour git twigs purge ):

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

Rechargez ensuite votre .zshrc .bashrc ou .zshrc :

 . ~/.bashrc 

ou

 . ~/.zshrc 

J’utilise le même stream avec GitHub, et je n’ai pas trouvé les réponses précédentes satisfaisantes, car les git branch --merged 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 twigs locales
  • git branch -vv : liste le statut des twigs locales
  • grep ": gone]" : filtre les supprimés
  • awk '{ print $1 }' : extraire leurs noms
  • xargs -n 1 git branch -d : passe le nom à la commande delete

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

essayer:

 git pull --prune

qui supprime votre twig locale si sa twig distante correspondante est supprimée.

Actualisé:

La déclaration ci-dessus n’est pas correcte.

En fait, git pull --prune ne supprimera que les twigs de suivi à distance telles que

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

Ensuite, vous pouvez lancer git branch -r pour vérifier les twigs de suivi à distance restantes sur votre ordinateur. Supposons que les twigs de gauche sont:

 origine / dev
 origine / maître

ce qui signifie que l’ origin/fff la twig 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 twigs locales qui:

  1. ne plus avoir de succursales distantes;
  2. peut être retiré en toute sécurité.

puis | xargs git branch -d | xargs git branch -d peut les supprimer toutes.

Cela devrait éviter de supprimer les twigs master et development avec la solution acceptée:

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

Pour les utilisateurs de Powershell, c’est l’équivalent de la réponse ci – dessus :

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

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-twigs = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d 

Solution très simple: supprimez votre repo local et clonez-le à nouveau. Peut ne pas sembler très élégant, mais c’est simple et vous comprendrez exactement ce que vous faites sans lire les pages de manuel :-).

J’ai écrit ce one-liner pour lister toutes les twigs locales qui n’ont pas de twig distante correspondante:

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

Après cela, la suppression de ces twigs locales est facile 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 

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

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

et au cas où vous voudriez également supprimer les traces inexistantes:

 git pull --prune 

Dans le cas où vous venez de pousser et de fusionner votre twig pour la maîsortingser, procédez comme suit dans git bash:

 git branch -d branch_name_to_delete 

Si vous êtes actuellement dans cette twig, cela vous ramènera à la maîsortingse. À ce stade, tirez avec

 git pull 

La réponse votée a le potentiel de supprimer master. Consdier l’exemple pratique ci-dessous.

J’ai eu deux twigs de fonctions hemen_README et hemen_BASEBOX qui ont été fusionnées en développement, puis développées et fusionnées en master. Les fonctions hemen_README et hemen_BASEBOX ont été supprimées à distance, mais elles étaient toujours affichées localement. Aussi je ne suis pas sur le master localement, mais sur le développement.

Dans ce cas

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) hemen_BASEBOX a535c0f added global exec paths to puppet manifest hemen_README ba87489 Updated Readme with considerable details master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest remotes/origin/hemen_README ba87489 Updated Readme with considerable details remotes/origin/master 2f093ce Merged in develop (pull request #3) 

Donc, si je lance la commande partielle ci-dessus

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*" hemen_BASEBOX hemen_README master 

Notez qu’il montre aussi master, qui sera éventuellement supprimé.

En tout cas, j’ai pu le faire. Je partage mon journal de session avec vous sur la façon dont j’ai réalisé cela.

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run Pruning origin URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git * [would prune] origin/hemen_BASEBOX * [would prune] origin/hemen_README hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin Pruning origin URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git * [pruned] origin/hemen_BASEBOX * [pruned] origin/hemen_README 

Je viens de vérifier si je serais élagué puis élagué. en regardant la commande de la twig ci-dessous, nous avons pris soin des télécommandes

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) hemen_BASEBOX a535c0f added global exec paths to puppet manifest hemen_README ba87489 Updated Readme with considerable details master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/master 2f093ce Merged in develop (pull request #3) 

Maintenant, allez-y et supprimez les twigs locales

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX Deleted branch hemen_BASEBOX (was a535c0f). hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README Deleted branch hemen_README (was ba87489). 

Bon maintenant les twigs sont comme vous le souhaitez.

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/master 2f093ce Merged in develop (pull request #3)