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.

0voto

Il arrive que vous souhaitiez simplement faire table rase du passé, mais que vous ayez besoin d'être certain de pouvoir revenir à un travail antérieur dans une agence locale.

Dans ce cas, le plus simple est d'archiver le clone local actuel et d'en créer un nouveau.

Ainsi, pour le dépôt X avec la branche par défaut en local, il suffit de

move X X-2021-11-10
git clone http://...../X

Si vous avez besoin de la même origine exacte, demandez à git

git -C X remote -v

0voto

lzap Points 5049

On dirait que tout le monde a une solution. Eh bien, si vous préférez un outil interactif avec TUI (text-based user interface), j'ai écrit un outil appelé git xcleaner. Il peut trouver des branches fusionnées, des branches rebasées (commits avec le même message commit), des branches élaguées ou des branches sélectionnées manuellement.

https://github.com/lzap/git-xcleaner

0voto

Pascal H. Points 162

Encore une autre réponse.

Si vous cherchez quelque chose d'original, voici l'alias que j'utilise avec fzf .

LANG=C git for-each-ref --sort=-committerdate --format '%(refname:short) %(upstream:track)' refs/heads \
  | awk '$2 == "[gone]" {print $1}' \
  | fzf --multi --bind ctrl-a:select-all,ctrl-t:toggle-all \
        --preview='git log --color=always --graph --format=compact {1}' \
        --header='Select [gone] branch to remove' \
        --header-first --reverse \
  | xargs --no-run-if-empty git branch -d

output example

Explications :

  • Force LANG=C pour éviter la localisation sur [gone] motif

  • Utilice git for-each-ref pour être libre de tout changement de format dans git branch

  • Filtrer en utilisant awk . J'ai essayé d'utiliser --format="%(if:equals=[gone])%..." mais cela implique de gérer les lignes vierges.

  • Utilice fzf pour sélectionner les branches à supprimer.

    Ajoute des raccourcis : [ctrl-a] pour tout sélectionner, et [ctrl-t] pour inverser la sélection (et [tab] pour sélectionner comme d'habitude). Vous validez en utilisant [enter] et peut abandonner en utilisant [esc] . J'utilise ce sélecteur de branche comme une étape de confirmation.

  • Afficher le journal de la branche sélectionnée sur le côté droit (pour se souvenir de la date et du contenu...).

    J'utilise un compact énumérés ci-dessous. Vous pouvez utiliser n'importe quel format de journal (pas trop large).

  • --no-run-if-empty est uniquement disponible avec GNU xargs .

    Il n'est pas obligatoire et permet d'éviter les erreurs lorsque vous abandonnez le processus (lié à git branch -d sans noms de branches).

L'alias peut avoir l'air horrible :

[alias]
      gone = "!f() { LANG=C git for-each-ref --sort=-committerdate --format '%(refname:short) %(upstream:track)' refs/heads | awk '$2 == \"[gone]\" {print $1}' | fzf --multi --bind ctrl-a:select-all,ctrl-t:toggle-all --preview='git log --color=always --graph --format=compact {1}' --header='Select [gone] branch to remove' --header-first --reverse | xargs --no-run-if-empty git branch -d ; }; f"
[pretty]
      compact = %Cred%h%Creset%C(auto)%d%Creset%n  Author: %an <%aE>%n  Date:  %cd%n     %s

(comme ci-dessus avec les escapes sur " )

-1voto

Voici la réponse simple qui a fonctionné pour moi en utilisant un client git :

Supprimez complètement le référentiel de votre machine, puis effectuez un nouveau check-out.

Pas besoin de s'embêter avec des scripts risqués.

-3voto

Chandan Sharma Points 1420

Les commandes ci-dessous ont résolu mon problème.

// To Delete Branch Locally
git branch -d localBranchName

// To Delete Branch Remotely
git push origin --delete remoteBranchName

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