1862 votes

Supprimer le suivi des branches qui ne sont plus sur la télécommande

Existe-t-il un moyen simple de supprimer toutes les branches de suivi dont l'équivalent distant n'existe plus ?

Exemple :

Branches (locales et distantes)

  • maître
  • origine/maître
  • origine/bug-fix-a
  • origine/bug-fix-b
  • origine/bug-fix-c

Localement, je n'ai qu'une branche master. Maintenant, je dois travailler sur Correction de bogues - alors je le vérifie, je travaille dessus et j'envoie les changements à la télécommande. Ensuite, je fais la même chose avec bug-fix-b .

Branches (locales et distantes)

  • maître
  • Correction de bogues -
  • bug-fix-b
  • origine/maître
  • origine/bug-fix-a
  • origine/bug-fix-b
  • origine/bug-fix-c

Maintenant, j'ai des succursales locales maître , Correction de bogues - , bug-fix-b . Le responsable de la branche Master va fusionner mes modifications dans maître et supprimer toutes les branches qu'il a déjà fusionnées.

L'état actuel est donc maintenant :

Branches (locales et distantes)

  • maître
  • Correction de bogues -
  • bug-fix-b
  • origine/maître
  • origine/bug-fix-c

Maintenant je voudrais appeler une commande pour supprimer les branches (dans ce cas-ci Correction de bogues - , bug-fix-b ), qui ne sont plus représentés dans le référentiel distant.

Ce serait quelque chose comme la commande existante git remote prune origin mais plutôt git local prune origin .

25 votes

Question très bien formulée avec un exemple très clair. Excellent travail !

3 votes

Pourquoi la majorité des réponses répondent : "Supprimer les branches qui ont été fusionnées", alors que la question porte spécifiquement sur les "branches qui ne sont plus sur la télécommande". C'est une différence assez importante.

4voto

Eugene Yokota Points 43213

Sur la base de Conseil Git : Supprimer les anciennes branches locales qui ressemble à La solution de jason.rickman J'ai implémenté une commande personnalisée dans ce but, appelée git parti en utilisant Bash :

$ git gone
usage: git gone [-pndD] [<branch>=origin]
OPTIONS
  -p  prune remote branch
  -n  dry run: list the gone branches
  -d  delete the gone branches
  -D  delete the gone branches forcefully

EXAMPLES
git gone -pn    prune and dry run
git gone -d     delete the gone branches

git gone -pn combine l'élagage et l'énumération des branches "disparues" :

$ git gone -pn
  bport/fix-server-broadcast         b472d5d2b [origin/bport/fix-server-broadcast: gone] Bump modules
  fport/rangepos                     45c857d15 [origin/fport/rangepos: gone] Bump modules

Ensuite, vous pouvez appuyer sur la gâchette en utilisant git gone -d o git gone -D .

Notas

  • L'expression régulière que j'ai utilisée est "$BRANCH/.*: gone]" donde $BRANCH serait normalement origin . Cela ne fonctionnera probablement pas si votre sortie Git est localisée en français, etc.
  • Sebastian Wiesner l'a également porté sur Rust pour les utilisateurs de Windows. Celui-ci est également appelé git parti .

4voto

Laobe Points 91

Peut-être que cette commande est ce que vous voulez.

Après la course :

git remote prune origin

puis courir :

diff <(git branch | sed -e 's/*/ /g') <(git branch -r | sed -e 's/origin\///g') | grep '^<'

ceci montrera toutes les branches qui ne sont pas dans (git branch -r) mais dans (git branch)

Cette méthode a un problème, elle montrera aussi la branche en local qui n'a pas été poussée avant.

4voto

Tom Pietrosanti Points 2299

Une solution plus simple pour les Windows ou autres qui ne veulent/peuvent pas script la ligne de commande ou qui ne veulent pas s'embêter avec PowerShell.

Larguer la liste des branches dans un fichier git branch > branches.txt
(ou git branch --merged > branches.txt si vous êtes du genre ceinture et bretelles ; git branch -d protégera contre la suppression des branches non fusionnées)

Ouvrez ce fichier dans votre éditeur et combinez toutes les lignes (j'ai utilisé sublime text, donc mettez tout en surbrillance et appuyez sur ctrl+j )

Ajouter git branch -d en tête de votre liste de filiales.

Sélectionnez tout, copiez et collez (clic droit dans la fenêtre cmd de Windows) dans la ligne de commande.

3voto

espaciomore Points 1

J'aime utiliser les pipes car cela rend la commande plus facile à lire.

C'est ma solution si vous souhaitez supprimer toutes les branches sauf master.

git branch | grep -v master | xargs -n 1 git branch -D

Pour supprimer d'autres branches qui correspondent à vos critères, modifiez le premier et le deuxième bloc.

git branch --merged | grep feature_name | xargs -n 1 git branch -D

1voto

BrunoLM Points 26573

Je suis arrivé avec ce bash script. Il garde toujours les branches develop , qa , master .

git-clear() {
  git pull -a > /dev/null

  local branches=$(git branch --merged | grep -v 'develop' | grep -v 'master' | grep -v 'qa' | sed 's/^\s*//')
  branches=(${branches//;/ })

  if [ -z $branches ]; then
    echo 'No branches to delete...'
    return;
  fi

  echo $branches

  echo 'Do you want to delete these merged branches? (y/n)'
  read yn
  case $yn in
      [^Yy]* ) return;;
  esac

  echo 'Deleting...'

  git remote prune origin
  echo $branches | xargs git branch -d
  git branch -vv
}

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