Problème: je veux un moyen de supprimer toutes les succursales locales que j'ai qui n'ont pas de télécommande. Il est assez facile de diriger les noms des branches dans un git branch -D {branch_name}
, mais comment puis-je 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 succursales, et il n'y en a qu'une seule avec une télécommande
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
Quelle commande puis-je exécuter pour obtenir no_upstream
une 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, cela ne me permettra pas de l'utiliser ou de le diriger vers d'autres commandes. J'ai l'intention de l'utiliser soit comme un script shell alias pourgit-delete-unbranched
ou peut-être faire une gemme super simple commegit-branch-delete-orphans
la source
Réponses:
J'ai récemment découvert
git branch -vv
quelle est la version "très verbeuse" dugit branch
commande.Il sort les branches avec les branches distantes si elles existent, au format suivant:
Une fois que vous avez cette sortie bien formatée, c'est aussi simple que de la passer en revue
cut
etawk
d'obtenir votre liste:Résultats dans la sortie suivante:
La
cut
partie normalise simplement les données en supprimant les deux premiers caractères (y compris*
) de la sortie avant de la passer àawk
.le
awk
partie imprime la première colonne s'il n'y a pas de crochets dans la troisième colonne.Bonus: créer un alias
Rendez-le facile à exécuter en créant un alias dans votre
.gitconfig
fichier global (ou ailleurs):Important: la barre oblique inverse doit être échappée dans l'alias, sinon vous aurez un fichier gitconfig non valide.
Bonus: filtrage à distance
Si, pour une raison quelconque, vous avez plusieurs télécommandes de suivi pour différentes succursales, il est assez facile de spécifier la télécommande que vous souhaitez vérifier. Ajoutez simplement le nom de la télécommande au modèle awk. Dans mon cas, c'est pour
origin
que je puisse faire ceci:la source
WIP:
toute façon ..? n'est-ce pas ce qu'une commande stash crée ..?git branch -vv
, même si une branche distante existe et correspond à ma branche locale, je ne verrais pas le à[origin/branch-name]
côté du résultat. J'ai dûdiff
utiliser deux listes de succursales pour déterminer ce qui était uniquement local.git branch -vv | grep -v origin/
est assez pour moigone
?git branch
(sans aucune option) répertorie uniquement les succursales locales, mais vous ne savez pas si elles suivent une succursale distante ou non.Habituellement, ces branches locales doivent être supprimées une fois fusionnées dans
master
(comme vu dans ce numéro de git-sweep ):Ce n'est pas aussi complet que vous le souhaitez, mais c'est un début.
la source
git branch -a --merged
.J'ai un problème similaire. Je souhaite supprimer toutes les succursales locales qui suivaient les succursales distantes qui sont maintenant supprimées. Je trouve que cela
git remote prune origin
était insuffisant pour supprimer les branches que je veux disparaître. Une fois la télécommande supprimée, je veux que le local disparaisse aussi. Voici ce qui a fonctionné pour moi:De mon
~/.gitconfig
:Voici une
git config --global ...
commande pour ajouter facilement ceci commegit prune-branches
:REMARQUE : j'ai changé le
-d
en-D
dans ma configuration actuelle, car je ne veux pas entendre Git se plaindre des branches non fusionnées. Vous pouvez également souhaiter cette fonctionnalité. Si tel est le cas, utilisez simplement à la-D
place de-d
à la fin de cette commande.De plus, FWIW, votre fichier de configuration global le serait presque toujours
~/.gitconfig
.(Correctif OS X)
Comme écrit, cela ne fonctionne pas sur OS X en raison de l'utilisation de
xargs -r
(merci, Korny ).Il
-r
s'agit d'empêcherxargs
de fonctionnergit branch -d
sans nom de branche, ce qui entraînera un message d'erreur "fatal: branch name required
". Si le message d'erreur ne vous dérange pas, vous pouvez simplement supprimer l'-r
argument dexargs
et vous êtes prêt.Cependant, si vous ne voulez pas voir de message d'erreur (et vraiment, qui pourrait vous en vouloir), vous aurez besoin de quelque chose d'autre qui vérifie si un tuyau est vide. Si vous pouvez utiliser ifne de moreutils . Vous insérez
ifne
avantxargs
, ce qui arrêteraxargs
de fonctionner avec des données vides. REMARQUE :ifne
considère tout n'est pas vide, cela inclut des lignes vides, afin que vous puissiez toujours voir ce message d'erreur. Je n'ai pas testé cela sur OS X.Voici cette
git config
ligne avecifne
:la source
Modification tardive:
Mieux vaut
Sur GNU / n'importe quoi
Si plus d'une poignée de branches étaient probables, il y aurait de meilleures façons d'utiliser
comm -23
la sortie degit branch|sed|sort
etgit config -l|sed|sort
.la source
Cela fonctionne pour moi:
git branch -vv | grep -v origin
(si votre télécommande porte un nom autre que l'origine, remplacez-la).
Cela listera toutes les branches qui ne suivent pas une télécommande, ce qui ressemble à ce que vous recherchez.
la source
git fetch --prune
.Je synthétise ma propre commande Git pour obtenir les
origin/***: gone
branches:git remote prune origin && git branch -vv
affichera les branches en mode détaillé.cut -c 3-
supprimera les tout premiers caractères.grep ': gone]'
n'imprimera que les branches distantes disparues .awk '{print $1}'
affichera le nom de la succursale.xargs -n1 -r echo git branch -d
affichera lagit branch -d
commande pour supprimer les branches (-n1 gérera une commande à la fois, -r pour éviter d'émettre une commande si aucune branche n'est présente).ASTUCE: supprimez la commande "echo" à exécuter les commandes au lieu de n'imprimer que, j'ai laissé cela dans la commande pour vérifier les commandes avant d'émettre vers git.
CONSEIL 2: problème
git branch -D
si et seulement si vous êtes sûr de vouloir supprimer les branches non fusionnéesla source
awk
, je ne savais pas que tu pouvais faire ça.Voici quelque chose que j'ai utilisé dans PowerShell avec des commentaires pour expliquer ce qu'il fait. Pour tenter de clarifier ce qui se passe, je n'ai utilisé aucune commande PowerShell abrégée (alias). N'hésitez pas à le compresser au niveau de crypticité souhaité :)
la source
Combinant quelques-unes des réponses existantes:
Par exemple:
la source