Je souhaite supprimer toutes les branches répertoriées dans la sortie de ...
$ git branch
... mais en gardant la branche actuelle, en une seule étape . Est-ce possible? Si c'est le cas, comment?
Je souhaite supprimer toutes les branches répertoriées dans la sortie de ...
$ git branch
... mais en gardant la branche actuelle, en une seule étape . Est-ce possible? Si c'est le cas, comment?
Réponses:
Sur la base de la réponse @pankijs, j'ai créé deux alias git:
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
À ajouter dans ~/.gitconfig
Et, comme @torek l'a souligné:
Notez que les minuscules
-d
ne suppriment pas une branche "non entièrement fusionnée" (voir la documentation). L'utilisation-D
supprimera ces branches , même si cela entraîne la «perte» des commits; utilisez ceci avec beaucoup de précaution , car cela supprime également les reflogs de branche, de sorte que le truc habituel de "récupération après suppression accidentelle" ne fonctionne pas non plus.
En gros, n'utilisez jamais la -force
version si vous n'êtes pas sûr à 300% de ne rien perdre d'important. Parce que c'est perdu pour toujours .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
supprimera toutes les branches sauf master (remplacez master par la branche que vous souhaitez conserver, mais ensuite cela supprimera master)
grep -v ^*
.
master-copy
, par exemple
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
d'abord (passez à la branche que vous souhaitez conserver> ex : master ):
git checkout master
deuxième ( assurez- vous que vous êtes sur master )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(ou -D
) autorise plusieurs noms de branche, mais il est un peu délicat de fournir automatiquement "toutes les branches locales à l'exception de celle sur laquelle je suis maintenant" sans écrire au moins un peu de code.
La "meilleure" méthode (formellement correcte) est d'utiliser git for-each-ref
pour obtenir les noms de branche:
git for-each-ref --format '%(refname:short)' refs/heads
mais il est encore plus difficile de savoir sur quelle branche vous vous trouvez ( git symbolic-ref HEAD
est la méthode "formellement correcte" pour cela, si vous voulez écrire un script sophistiqué).
Plus commodément, vous pouvez utiliser git branch
, qui imprime les noms de vos branches locales précédés de deux espaces ou (pour la branche actuelle) d'un astérisque *
. Alors, exécutez ceci à travers quelque chose pour supprimer la *
version et il vous reste des noms de branche séparés par des espaces, que vous pouvez ensuite passer à git branch -d
:
git branch -d $(git branch | grep -v '^*')
ou:
git branch | grep -v '^*' | xargs git branch -d
Notez que les minuscules -d
ne suppriment pas une branche "non entièrement fusionnée" (voir la documentation). L'utilisation -D
supprimera ces branches, même si cela entraîne la «perte» des commits; utilisez ceci avec beaucoup de précaution, car cela supprime également les reflogs de branche, de sorte que le truc habituel de "récupération après suppression accidentelle" ne fonctionne pas non plus.
git branch -D $(git branch | grep -v '^*')
cas si vous souhaitez supprimer les branches qui ont fusionné.
Pour supprimer toutes les branches fusionnées (sauf la version actuelle -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
aussi j'ai fait une telle commande pour le nettoyage complet du repo:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
pris d' ici .
Supprimez toutes les branches sauf une branche spécifique :
git branch | grep -v "branch name" | xargs git branch -D
Supprimez toutes les branches locales à l'exception de develop et master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Pour Windows, dans Powershell, utilisez:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Supprimer toutes les branches fusionnées localement:
git branch -D `git branch --merged | grep -v \* | xargs`
Supprimez toutes les branches sauf une branche spécifique :
git branch | grep -v "branch name" | xargs git branch -D
Supprimez toutes les branches locales à l'exception de develop et master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
J'ai déjà créé cette construction pour mon environnement Windows. Cela aidera peut-être quelqu'un d'autre. Pendant l'exécution, la branche maître et actuelle ne sont pas supprimées . Toutes les autres branches fusionnées seront supprimées malgré tout.
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
Je vois donc beaucoup de noms de branches codés en dur ici ... Et je pense que ma réponse ici est plus précise à la partie "branche actuelle" de la question tout en la gardant sur une seule ligne et lisible pour les débutants comme moi. Juste pour donner du crédit là où c'est dû, la réponse est plutôt évidemment basée sur la réponse de @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
et je l'ai aliasée sur une ligne dans mon .bash_aliases dans debian aussi.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Bien que je pense que certaines fonctionnalités de bash doivent être activées pour que la sous-commande s'exécute sur certaines lignes de commande)
J'utilise ceci parce que j'arrive à être plus sélectif dans ce que je ne veux pas supprimer. Cette commande ci-dessous supprime toutes les branches sauf master, develop et la branche actuelle.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Alors je mets ça dans mon ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
À mon humble avis, le moyen le plus sûr de supprimer les succursales locales est:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
En outre, plus d'informations liées à ce sujet, vous pouvez trouver Supprimer toutes les branches git locales
gone
marqueur que vous devez utiliser -vv
(verbeux deux fois), mais -a
ne vous aidera pas (il répertorie également les branches distantes)