Je suis un processus de développement où je crée une nouvelle branche locale pour chaque nouvelle fonctionnalité ou carte d'histoire. Une fois terminé, je fusionne la branche en maître, puis je pousse.
Ce qui a tendance à se produire au fil du temps en raison d'une combinaison de paresse ou d'oubli, c'est que je me retrouve avec une grande liste de succursales locales, dont certaines (comme les pointes) peuvent ne pas avoir été fusionnées.
Je sais comment lister toutes mes branches locales et je sais comment supprimer une seule branche mais je me demandais s'il y avait une commande git qui me permet de supprimer toutes mes branches locales?
Voici la sortie de la git branch --merged
commande.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Toutes les tentatives de suppression de branches répertoriées avec grep -v \*
(selon les réponses ci-dessous) entraînent des erreurs:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
J'utilise:
git 1.7.4.1
ubuntu 10.04
GNU bash, version 4.1.5 (1) -release
GNU grep 2.5.4
Réponses:
La sous-commande 'git branch -d' peut supprimer plusieurs branches. Donc, simplifiant la réponse de @ sblom mais ajoutant un xargs critique:
ou encore simplifié pour:
Surtout, comme l'a noté @AndrewC, l'utilisation
git branch
de scripts est déconseillée. Pour l'éviter, utilisez quelque chose comme:Attention aux suppressions!
la source
error:branch 'STORY-123-Short-Description' not found.
pour chacune des branches répertoriées.error:branch 'STORY-123-Short-Description' not found.
erreur, cela est probablement dû aux paramètres de couleur git. Cela a fonctionné pour moi (notez l'--no-color
option):git branch --no-color --merged | grep -v \* | xargs git branch -D
J'ai trouvé un moyen plus agréable dans un commentaire sur ce problème sur github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
modifier: ajout d'une option sans couleur et exclusion de la branche stable (ajoutez d'autres branches si nécessaire dans votre cas)
la source
error: branch 'my-branch-name' not found.
pour chaque branche. Utilisation de git version 1.8.3.4 (Apple Git-47). Une idée pourquoi?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
L'analyse de la sortie de
git branch
n'est pas recommandée et n'est pas une bonne réponse pour les futurs lecteurs sur Stack Overflow.git branch
est ce qu'on appelle une commande de porcelaine. Les commandes de porcelaine ne sont pas conçues pour être analysées en machine et la sortie peut changer entre les différentes versions de Git.git branch
une manière qui la rend difficile à analyser (par exemple, la colorisation). Si un utilisateur a défini,color.branch
vous obtiendrez des codes de contrôle dans la sortie, cela entraîneraerror: branch 'foo' not found.
si vous essayez de le diriger vers une autre commande. Vous pouvez contourner cela avec l'--no-color
indicateur togit branch
, mais qui sait quelles autres configurations utilisateur pourraient casser les choses.git branch
peut faire d'autres choses ennuyeuses à analyser, comme mettre un astérisque à côté de la branche actuellement extraiteLe responsable de git a ceci à dire sur les scripts autour de la
git branch
sortieLes réponses qui suggèrent de modifier manuellement les fichiers dans le
.git
répertoire (comme .git / refs / heads) sont également problématiques (les références peuvent être dans .git / pack-refs à la place, ou Git peut changer leur disposition interne à l'avenir).Git fournit la
for-each-ref
commande pour récupérer une liste de branches.Git 2.7.X introduira l'
--merged
option pour que vous puissiez faire quelque chose comme ci-dessous pour trouver et supprimer toutes les branches fusionnées dansHEAD
Git 2.6.X et les versions antérieures, vous devrez répertorier toutes les branches locales, puis les tester individuellement pour voir si elles ont été fusionnées (ce qui sera beaucoup plus lent et légèrement plus compliqué).
la source
git branch --no-color 2>/dev/null
?git branch
une commande porcelaine, et il n'y a aucune garantie que la sortie ne changera pas dans une future version de git.La manière la plus simple de supprimer toutes les branches mais de conserver d'autres comme "develop" et "master" est la suivante:
très utile !
la source
Pour supprimer toutes les branches sauf celle que vous avez actuellement extraite:
Je recommanderais de passer
git branch -D $b
à anecho $b
les premières fois pour vous assurer qu'il supprime les branches que vous souhaitez.la source
error:branch 'a_branch_name' not found.
je peux voir ce que vous essayez de faire et j'ai joué avec la commande, mais pour une raison quelconque, git ne semble pas aimer les noms de branche fournis ...git branch --merged
STORY-123-Short-Description
git branch --merged
, vous obtenez une liste avec un de ceux sur chaque ligne?error:branch 'a_branch_name' not found.
? Ou se plaint-il d'un des noms de branche de votregit branch
sortie ci-dessus?La commande ci-dessous supprimera toutes les branches locales à l'exception de la branche principale.
La commande ci-dessus
la source
git branch | grep -v "master" | xargs git branch -d
abord pour ne pas supprimer les branches non fusionnées, juste pour être sûr. Mais belle réponse!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Juste une note, je voudrais passer à git 1.7.10. Vous obtiendrez peut-être des réponses ici qui ne fonctionneront pas sur votre version. Je suppose que vous devrez préfixer le nom de la branche avec
refs/heads/
.ATTENTION, procédez comme suit uniquement si vous avez fait une copie de votre dossier de travail et de votre répertoire .git.
Il m'arrive parfois d'aller de l'avant et de supprimer les branches dont je ne veux pas directement
.git/refs/heads
. Toutes ces branches sont des fichiers texte qui contiennent les 40 caractères sha-1 du commit vers lequel ils pointent. Vous aurez des informations superflues dans votre.git/config
si vous aviez un suivi spécifique configuré pour l'un d'eux. Vous pouvez également supprimer ces entrées manuellement.la source
Essayez la commande shell suivante:
Explication:
git branch | grep -v "master"
commandexargs
commandexargs git branch -D
la source
Pour supprimer toutes les succursales locales sous Linux, sauf celle sur laquelle vous vous trouvez
la source
J'ai trouvé plus facile d'utiliser simplement l'éditeur de texte et le shell.
git checkout <TAB>
dans la coquille. Affiche toutes les succursales locales.git branch -D <PASTE THE BRANCHES NAMES HERE>
.C'est tout.
la source
J'ai eu un genre de situation similaire et j'ai récemment trouvé la commande suivante utile.
Si vous souhaitez conserver plusieurs branches, alors
j'espère que cela aide quelqu'un.
la source
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
En fait, je pense que vous les aviez à l'origine mais ils se sont perdus dans le formatage SO.Dans la ligne de commande Windows, supprimez tout sauf la branche en cours d'extraction à l'aide de:
la source
Si vous n'avez pas besoin de passer par Git lui-même, vous pouvez également supprimer les têtes sous .git / refs / heads manuellement ou par programme. Les éléments suivants devraient fonctionner avec un ajustement minimal sous Bash:
Cela supprimera toutes les succursales locales à l'exception de votre branche principale. Puisque vos branches en amont sont stockées sous .git / refs / remotes , elles resteront intactes.
Si vous n'utilisez pas Bash, ou si vous souhaitez récupérer de nombreux référentiels Git à la fois, vous pouvez faire quelque chose de similaire avec GNU find:
La solution de recherche est probablement plus portable, mais l'élagage des chemins et des noms de fichiers est délicat et potentiellement plus sujet aux erreurs.
la source
Aucune des réponses n'a pleinement satisfait mes besoins, alors c'est parti:
Cela supprimera toutes les branches locales fusionnées et commençant par
feature/
,bugfix/
ouhotfix/
. Ensuite, la télécommande en amontorigin
est élaguée (vous devrez peut-être saisir un mot de passe).Fonctionne sur Git 1.9.5.
la source
Sur la base d'une combinaison d'un certain nombre de réponses ici - si vous souhaitez conserver toutes les branches qui existent sur la télécommande mais supprimer le reste , la ligne suivante fera l'affaire:
la source
Bien que ce ne soit pas une solution en ligne de commande, je suis surpris que l' interface graphique Git n'ait pas encore été suggérée.
J'utilise la ligne de commande 99% du temps, mais dans ce cas, c'est bien trop lent (d'où la question d'origine), ou vous ne savez pas ce que vous êtes sur le point de supprimer lorsque vous avez recours à une manipulation de shell longue mais intelligente.
L'interface utilisateur résout ce problème car vous pouvez rapidement cocher les branches que vous souhaitez supprimer et vous rappeler celles que vous souhaitez conserver, sans avoir à taper une commande pour chaque branche.
Dans l'interface utilisateur, accédez à Branche -> Supprimer et Ctrl + Cliquez sur les branches que vous souhaitez supprimer afin qu'elles soient mises en surbrillance. Si vous voulez être sûr qu'ils sont fusionnés dans une branche (par exemple
dev
), sous Supprimer uniquement si fusionné dans définir la branche locale surdev
. Sinon, définissez-le sur Toujours pour ignorer cette vérification.la source
Pour PowerShell, cela fonctionnera:
la source
Le script suivant supprime les branches. Utilisez-le et modifiez-le à vos risques et périls, etc. etc.
Sur la base des autres réponses de cette question, j'ai fini par écrire un script bash rapide pour moi-même. Je l'ai appelé "gitbd" (branche git -D) mais si vous l'utilisez, vous pouvez le renommer comme vous le souhaitez.
Il proposera de supprimer toutes les branches qui correspondent à un argument de modèle, s'il est transmis, ou toutes les branches locales lorsqu'elles sont appelées sans argument. Cela vous donnera également une étape de confirmation, car, vous savez, nous supprimons des choses, donc c'est bien.
C'est un peu stupide - s'il n'y a pas de branches qui correspondent au motif, il ne s'en rend pas compte.
Un exemple de sortie:
la source
J'ai écrit un script shell afin de supprimer toutes les branches locales sauf
develop
la source
Les réponses ci-dessus fonctionnent bien. Voici une autre approche lorsque nous avons beaucoup de branches dans le référentiel local et que nous devons supprimer de nombreuses branches, sauf quelques-unes qui se trouvent dans la machine locale.
Première
git branch
liste toutes les succursales locales.Transposer la colonne des noms de branche en une seule ligne dans le fichier en exécutant une commande unix
git branch > sample.txt
Cela l'enregistrera dans le fichier sample.txt . Et courir
awk 'BEGIN { ORS = " " } { print }' sample.txt
commande dans le shell. Cela transformera la colonne en ligne et copiera la liste des noms de branche sur une seule ligne.
Et puis courez
git branch -D branch_name(s)
.Cette action supprimera toutes les succursales répertoriées présentes dans le réseau local.
la source
La manière la plus pragmatique: assurez-vous que vous n'avez pas de travail non engagé
master
, validez / push si nécessaire, clonez une nouvelle copie du référentiel et supprimez l'ancienne.la source
Pour cela, vous pouvez utiliser git-extras
la source
Je n'ai pas grep ou autre unix sur ma boîte mais cela a fonctionné depuis le terminal de VSCode:
git branch -d $(git branch).trim()
J'utilise le d minuscule pour ne pas supprimer les branches non fusionnées.
J'étais également sur master quand je l'ai fait, donc
* master
n'existe pas donc il n'a pas essayé de supprimer master.la source
master
, cette commande sera suppriméemaster
.Assurez-vous de le faire en premier
Une fois que vous disposez de toutes les informations sur les succursales distantes, utilisez la commande suivante pour supprimer toutes les succursales sauf le maître
la source