126 votes

Lister toutes les branches locales sans télécommande

Problème : Je veux un moyen de supprimer toutes les branches locales que j'ai et qui n'ont pas de télécommande. Il est assez facile de mettre les noms des branches dans un fichier git branch -D {branch_name} mais comment obtenir cette liste en premier lieu ?

Par exemple :

Je crée une nouvelle branche sans télécommande :

$ git co -b no_upstream

Je liste toutes mes branches, et il n'y en a qu'une avec une télécommande

$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master

Quelle commande puis-je lancer pour obtenir no_upstream comme réponse ?

Je peux courir git rev-parse --abbrev-ref --symbolic-full-name @{u} et cela montrera qu'il n'a pas de télécommande :

$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Mais comme il s'agit d'une erreur, je ne peux pas l'utiliser ou la transmettre à d'autres commandes. J'ai l'intention de l'utiliser soit comme un script shell aliasé à git-delete-unbranched ou peut-être faire un Gem super simple comme git-branch-delete-orphans

12voto

fiorentinoing Points 411

Je synthétise ma propre commande Git pour obtenir le fichier origin/***: gone branches :

git remote prune origin && git branch -vv | cut -c 3- | grep ': gone]' | awk '{print $1}' | xargs -n1 -r echo git branch -d

git remote prune origin && git branch -vv imprimera les branches en mode verbeux.

cut -c 3- supprimera les tout premiers caractères.

grep ': gone]' n'imprimera que le disparu les branches distantes.

awk '{print $1}' imprimera le nom de la branche.

xargs -n1 -r echo git branch -d imprimera le git branch -d pour supprimer les branches (-n1 gérera une commande par fois, -r pour éviter d'émettre une commande si aucune branche n'est présente).

INDICE : supprimer la commande "echo" pour exécuter les commandes au lieu d'imprimer seulement, j'ai laissé cela dans la commande pour vérifier les commandes avant de les envoyer à git.

CONSEIL 2 : numéro git branch -D si et seulement si vous êtes sûr de vouloir supprimer les branches non émergées.

2voto

grahamesd Points 619

Voici quelque chose que j'ai utilisé dans PowerShell avec des commentaires pour expliquer ce qu'il fait. Dans le but de rendre clair ce qui se passe, je n'ai pas utilisé de commandes PowerShell abrégées (alias). N'hésitez pas à le comprimer jusqu'au niveau d'énigme que vous souhaitez :)

$verboseList = @(git branch -vv)
foreach ($line in $verboseList)
{
    # Get the branch name
    $branch = [regex]::Match($line, "\s(\S+)\s").Captures.Groups[1].Value
    # Check if the line contains text to indicate if the remote is deleted
    $remoteGone = $line.Contains(": gone]")
    # Check if the line does not contain text to indicate it is a tracking branch (i.e., it's local)
    $isLocal = !($line.Contains("[origin/"))
    if ($remoteGone -or $isLocal)
    {
        # Print the branch name
        $branch
    }
}

1voto

Kevin Davies Points 111

La réponse la plus votée ici ne fonctionne pas sur mon système voir Gist

Ce qui suit fonctionne et est raisonnablement propre.

git branch -v | awk '$3 == "[gone]" { print $1 }' | xargs git branch -D

Utilisez -d si vous ne voulez pas supprimer les branches non fusionnées.

0voto

Reid Points 247

En combinant quelques-unes des réponses existantes :

[alias]
        branch-local = !git branch -vv | cut -c 3- | egrep '([0-9a-f]{7} [^[])|(: gone\\])' | sed -E 's/(^.+[0-9a-f]{7} (\\[.+\\])?).*$/\\1/'

Par exemple :

$ git branch-local
autogen_autoreconf      fcfb1c6 [github/autogen_autoreconf: gone]
autotools_documentation 72dc477 [github/autotools_documentation: gone]
cray-mpich-messy        2196f4b
epel-sphinx             cfda770
lammps                  07d96a7 [github/lammps: gone]
lark-error              9ab5d6c [github/lark-error: gone]
no-root2                c3894d1
openmpi-cray            69326cf [github/openmpi-cray: gone]
shellcheck-cleanup      40d90ec
travis-python36         cde072e
update_vagrant_default  4f69f47 [github/update_vagrant_default: gone]
web-docs                e73b4a8

0voto

Darren Hicks Points 1021

Aucune des réponses existantes ne semble fonctionner pour moi.

Voici ma solution pour lister les branches locales qui ne sont pas aussi distantes

comm -13 <(git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-) <(git branch | cut -c 3-)

Et voici une explication de son fonctionnement :

  1. Considérez la liste de toutes les branches distantes (sans 'origin/' ou espaces de tête). git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-

  2. Considérez la liste de toutes les branches locales (sans astérisques ni espaces en tête) git branch | cut -c 3-

  3. Comparez ces deux listes et montrez-moi tout ce qui se trouve dans la liste 2 (mes branches locales) qui n'est pas dans la liste 1 (la liste des branches distantes) comm -13 <(git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-) <(git branch | cut -c 3-)

comm peut prendre une combinaison des drapeaux -1, -2 et -3 indiquant le fichier dont il faut supprimer les lignes (unique au fichier 1, unique au fichier 2 ou commun aux deux)

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