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

Mailo Points 978

Je ne sais pas depuis combien de temps, mais j'utilise maintenant git-up, qui s'occupe de cela.

Je le fais. git up et il commence à suivre les nouvelles branches et supprime les anciennes.

Pour être clair, il ne s'agit pas d'une commande git prête à l'emploi https://github.com/aanand/git-up

De plus, il stocke également l'arbre sale et effectue des rebases toujours avec seulement git up .

J'espère que cela sera utile à quelqu'un

0voto

lps Points 704

Voici une solution que j'utilise pour la coquille de poisson. Testé sur Mac OS X 10.11.5 , fish 2.3.0 y git 2.8.3 .

function git_clean_branches
  set base_branch develop

  # work from our base branch
  git checkout $base_branch

  # remove local tracking branches where the remote branch is gone
  git fetch -p

  # find all local branches that have been merged into the base branch
  # and delete any without a corresponding remote branch
  set local
  for f in (git branch --merged $base_branch | grep -v "\(master\|$base_branch\|\*\)" | awk '/\s*\w*\s*/ {print $1}')
    set local $local $f
  end

  set remote
  for f in (git branch -r | xargs basename)
    set remote $remote $f
  end

  for f in $local
    echo $remote | grep --quiet "\s$f\s"
    if [ $status -gt 0 ]
      git branch -d $f
    end
  end
end

Quelques notes :

Assurez-vous de définir le bon base_branch . Dans ce cas, j'utilise develop comme branche de base, mais ça peut être n'importe quoi.

Cette partie est très importante : grep -v "\(master\|$base_branch\|\*\)" . Cela permet de s'assurer que vous ne supprimez pas master ou votre branche de base.

J'utilise git branch -d <branch> comme une précaution supplémentaire, afin de ne pas supprimer une branche qui n'a pas été entièrement fusionnée avec l'amont ou le HEAD actuel.

Une façon simple de tester est de remplacer git branch -d $f con echo "will delete $f" .

Je suppose que je devrais aussi ajouter : À UTILISER À VOS RISQUES ET PÉRILS !

0voto

raviraja Points 570

J'ai écrit un script Python utilisant GitPython pour faire supprimer les branches locales qui n'existent pas sur le distant.

    import git
    import subprocess
    from git.exc import GitCommandError
    import os

    def delete_merged_branches():
        current_dir = input("Enter repository directory:")
        repo = git.Repo(current_dir)
        git_command = git.Git(current_dir)

        # fetch the remote with prune, this will delete the remote references in local.
        for remote in repo.remotes:
            remote.fetch(prune=True)

        local_branches = [branch.name for branch in repo.branches]
        deleted_branches = []

        # deleted_branches are the branches which are deleted on remote but exists on local.
        for branch in local_branches:
            try:
                remote_name = 'origin/'+ branch
                repo.git.checkout(remote_name)
            except GitCommandError:
            # if the remote reference is not present, it means the branch is deleted on remote.
                deleted_branches.append(branch)

        for branch in deleted_branches:
            print("Deleting branch:"+branch)
            git_command.execute(["git", "branch", "-D",branch])

        # clean up the work flow.
        repo.git.checkout('master')
        repo.git.pull()

    if __name__ == '__main__':
        delete_merged_branches()

J'espère que quelqu'un trouvera cela utile. N'hésitez pas à ajouter des commentaires si j'ai oublié quelque chose.

0voto

Noah Gary Points 511

Si vous utilisez zsh coquille avec Oh My Zsh installé, le moyen le plus simple de le faire en toute sécurité est d'utiliser l'autocomplétion intégrée.

Déterminez d'abord les branches que vous voulez supprimer :

~ git branch --merged

  branch1
  branch2
  branch3
* master

ceci vous montrera une liste de branches déjà fusionnées

Une fois que vous en connaissez quelques-uns que vous voulez supprimer, tapez :

~ git branch -d 

Il vous suffit d'appuyer sur la touche [tab] pour obtenir la liste des agences locales. Utilisez la fonction de tabulation ou appuyez à nouveau sur la touche [tab] et vous pourrez les parcourir pour sélectionner une branche en appuyant sur la touche [entrée].

Tab Sélectionnez les branches encore et encore jusqu'à ce que vous ayez une liste des branches que vous voulez supprimer :

~ git branch -d branch1 branch2 branch3

Il ne vous reste plus qu'à appuyer sur la touche Entrée pour supprimer votre collection de branches.

Si vous n'utilisez pas zsh sur votre terminal... Obtenez-le ici.

0voto

lacostenycoder Points 401

J'ai récemment mis en ligne une solution que j'utilise depuis un certain temps, qui s'appuie sur le nommage des branches pour inclure les numéros d'édition, vous pouvez voir cette réponse qui renvoie à ma version de git_clean_branches qui est un script interactif pour supprimer les branches dont les problèmes ont été fermés (normalement par un squash merge).

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