Können Sie mit Git mehrere Zweige in einem Befehl löschen?


355

Ich möchte meine lokale Repository bereinigen, die eine Tonne von Altarmen hat: zum Beispiel 3.2, 3.2.1, 3.2.2etc.

Ich hatte auf einen hinterhältigen Weg gehofft, viele von ihnen auf einmal zu entfernen. Da sie größtenteils einer Dot-Release-Konvention folgen, dachte ich, dass es vielleicht eine Abkürzung gibt, um zu sagen:

git branch -D 3.2.*

und töte alle 3.2.x Zweige.

Ich habe diesen Befehl ausprobiert und er hat natürlich nicht funktioniert.


11
git branch -D $(git branch | grep 3.2*)- Das hat bei mir funktioniert. Es löscht die Zweige, deren Name mit "3.2" beginnt. grep- Mustervergleich in der Ausgabe (von git branchin diesem Fall). $()- bedeutet, das Ergebnis auszuführen und zu platzieren. |- Verkettung.
Eduard

4
Bemerkenswert für diejenigen, die nicht wissen, dass -Des sich um eine erzwungene Löschung handelt, sollte -din den meisten Fällen verwendet werden, um zuerst sicherer zu sein.
Redfox05

Antworten:


363

Nicht mit dieser Syntax. Aber Sie können es so machen:

git branch -D 3.2 3.2.1 3.2.2

Grundsätzlich löscht der Git-Zweig mehrere Zweige mit einem einzigen Aufruf für Sie. Leider wird der Zweig nicht vervollständigt. Obwohl Sie in Bash Folgendes tun können:

git branch -D `git branch | grep -E '^3\.2\..*'`

2
Die Fertigstellung git branch -D/-dfunktioniert gut für mich. Vielleicht möchten Sie Ihre aktualisieren (möglicherweise aus dem neuesten git.git Contrib-Verzeichnis).
Cascabel

19
Anstelle von git branch | ...Ihnen könnte verwenden $(git for-each-ref --format='%(refname:short)' refs/heads/3.*). Es ist länger, ich weiß, aber es ist garantiert eine geeignete Ausgabe, während es git brancheine hübsche Ausgabe mit Dingen wie *und ->(für Symrefs) hat, die Sie in Skripten / Einzeilern durcheinander bringen können.
Cascabel

3
Vielleicht bin ich der einzige mit diesem Problem, aber ich habe mich darauf grepgeeinigt, immer die Flagge einzuschließen --color=always- git branch -Dwarf, error: branch 'my_branch' not found.bis ich ohne die Farbflagge lief.
Eebbesen

@eebbesen Hast du es global deaktiviert? Ich git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
stoße

2
Mit der Klammererweiterung können Sie schreiben git branch -D 3.2{,.1,.2}, um alle drei Zweige zu löschen. Gnu.org/software/bash/manual/html_node/Brace-Expansion.html
robstarbuck

147

Nun, im schlimmsten Fall könnten Sie verwenden:

git branch | grep '3\.2' | xargs git branch -d

22
Dies ist so ziemlich die perfekte Methode für alle, die eine standardisierte Präfixnotation für Zweignamen verwenden (z. B. "fix / ..." oder "feature / ...").
Haz

4
Einfach und effizient! Ich würde empfehlen, zuerst ohne das | xargs git branch -dTeil zu laufen , um zu überprüfen, was tatsächlich gelöscht wird.
Mathielo

Es wird empfohlen, nicht für grepdie Ausgabe von git branch, da es zum Lesen gedacht ist, nicht zum Parsen. Kann sich jederzeit ändern. Verwenden Sie die for-each-refzusammen mit den --formatParametern, wie in anderen Antworten vorgeschlagen, und kombinieren Sie sie dann mit den Vorschlägen in dieser Antwort.
Redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

BEARBEITEN:

Eine sicherere Version (vorgeschlagen von Jakub Narębski und Jefromi), da die Ausgabe von Git-Zweigen nicht für die Skripterstellung vorgesehen ist:

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... oder die xargs-freien:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
Verwenden Sie die git branchAusgabe nicht für Skripte. Verwenden Sie git for-each-ref.
Jakub Narębski

1
So löschen Sie Tags mit dem @ -Symbol:git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
thaddeusmt

Hat einen Tippfehler. Sollte "/3.2/*" sein, nicht "/3.2*". Außerdem haben Sie anscheinend andere Antworten in Ihre eigenen kopiert.
Max MacLeod

Kein Tippfehler hier. Von der Manpage:If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
Gawi

1
Bemerkenswert für diejenigen, die nicht wissen, dass -Des sich um eine erzwungene Löschung handelt, sollte -din den meisten Fällen verwendet werden, um zuerst sicherer zu sein.
Redfox05

115

Sie können git branch --list verwenden, um die berechtigten Zweige aufzulisten, und git branch -D / -d verwenden, um die berechtigten Zweige zu entfernen.

Ein Beispiel für einen Liner:

git branch -d `git branch --list '3.2.*'`

Wenn ich das versuche, bekomme ich eine Reihe von Fehlermeldungen wie error: branch 'package.json' not found.. Es scheint, dass das * zu früh erweitert wird und versucht, einen Zweig zu löschen, der dem Namen jeder Datei und jedes Verzeichnisses entspricht.
Antimon

Das funktioniert gut! Ich habe Probleme, dies als Alias ​​zu verwenden, gitconfigobwohl ...
Whomaniac

6
Diese Antwort muss höher in der Liste sein, super sauber, funktioniert, kein grep
jemiloii

1
Schön, dass dieser einfach zuerst zu testen ist, indem er nur ausgibtgit branch --list '3.2.*'
Will

3
Auf Fensterngit branch -d (git branch --list '3.2.*').trim()
Mattias Josefsson

38

Vor kurzem habe ich nach einer Lösung für das gleiche Problem gesucht, schließlich habe ich eine Antwort gefunden und es funktioniert sehr gut:

  1. Öffnen Sie das Terminal oder ein gleichwertiges Gerät.
  2. Geben Sie git branch | ein grep "pattern" für eine Vorschau der zu löschenden Zweige.
  3. Geben Sie git branch | ein grep "pattern" | xargs git branch -D

Diese Lösung ist fantastisch und wenn Sie eine vollständige Erklärung jedes Befehls und seiner Funktionsweise wünschen, finden Sie ihn hier .


28

Verwenden

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
kleiner Tipp: Wenn Sie den letzten Teil des Befehls "| xargs git branch -D" entfernen, werden nur die passenden Zweige ausgegeben. So können Sie eine Vorschau der Zweige anzeigen, die gelöscht werden
Max MacLeod

1
Außerdem habe ich einen Alias ​​hinzugefügt, um dies zu vereinfachen: alias grefs='git for-each-ref --format="%(refname:short)"'damit ich es dann tun kanngrefs | grep 'regexpattern' | xargs git branch -D
anglesen

Liebte es. Schön und einfach!
Bhargav Ponnapalli

15

Vielleicht finden Sie dies nützlich:

Wenn Sie alle Zweige entfernen möchten, die nicht "master", "foo" und "bar" sind,

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'etwas' ist ein Matcher mit Inversion.


Ich persönlich mag -DOption im Vergleich zu anderen Antworten. Danke für die Antwort hier @Adi. Lösungen funktionieren bei mir.
AMIC MING

9

Genau aus diesem Grund setze ich meine Initialen und einen Bindestrich (at-) als erste drei Zeichen des Zweignamens ein:

git branch -D `git branch --list 'at-*'`

Alle Antworten sagen im Grunde, das ist einfach das Einfachste.
Tfantina

7

Wenn Sie nicht nur die Eingabeaufforderung git git guiverwenden möchten , können Sie den Menüpunkt Branch-> Delete jederzeit ausführen und verwenden. Wählen Sie alle Zweige aus, die Sie löschen möchten, und lassen Sie sie rippen.


Auf diese Weise können Sie jedoch nur lokale Zweige löschen
Stealth Rabbi

7

Powershell-Lösung:

Wenn Sie Windows ausführen, können Sie mit PowerShell mehrere Zweige gleichzeitig entfernen ...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

Mit dem Befehl Select-String von Powershell können Sie auch genau festlegen, wie der Mustervergleich funktionieren soll. Schauen Sie sich die Powershell-Dokumente an .


6

Behalten Sie "Entwickeln" bei und löschen Sie alle anderen lokal

    git branch | grep -v "develop" | xargs git branch -D 

5

Ich habe eine kleine Funktion erstellt, die aufgrund der Antwort von @gawi (oben) nützlich sein könnte.

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

Fügen Sie das zu Ihrem hinzu .bash_profileund starten Sie Ihr Terminal neu. Dann können Sie über die Befehlszeile wie folgt aufrufen:

removeBranchesWithPrefix somePrefix

Hinweis

Ich habe es derzeit für ein weiches Löschen eingerichtet, was bedeutet, dass die Zweige erst gelöscht werden, wenn sie bereits zusammengeführt wurden. Wenn Sie am Rande leben möchten, wechseln Sie -dzu -Dund es wird alles mit dem Präfix gelöscht, unabhängig davon!


5

Wenn Sie wirklich alle Ihre Filialen reinigen müssen, versuchen Sie es

git branch -d $(git branch)

Es werden alle lokal zusammengeführten Zweige gelöscht, mit Ausnahme desjenigen, den Sie gerade einchecken.

Es ist ein guter Weg, um Ihre lokale sauber zu machen


Das hat für mich gut genug funktioniert. Es blieben zwei Zweige außer dem einen, den ich war, den ich dann mit demselben Befehl entfernte, aber mit einem Großbuchstaben "-D" anstelle von "-d". Ich habe ein paar Fehler bekommen, weil Git keine Dateien gefunden hat, aber die Zweige wurden gelöscht.
Lurifaxel

3

Vielleicht gefällt Ihnen dieses kleine Element ... Es zieht die Liste und fragt nach Bestätigung jedes Elements, bevor schließlich alle Auswahlen gelöscht werden ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

Verwenden Sie -D, um Löschvorgänge zu erzwingen (wie üblich).

Zur besseren Lesbarkeit ist hier die Zeile für Zeile aufgeschlüsselt ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

Hier ist der Xargs-Ansatz ...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

endlich möchte ich das in meiner .bashrc haben

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

Auf diese Weise kann ich nur sagen

gitSelect | xargs git branch -D.

3

Für reine Seelen, die PowerShell verwenden, hier das kleine Skript git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

es funktioniert richtig für mich:

git branch | xargs git branch -d

git branch | xargs git branch -D

Löschen Sie alle lokalen Zweige


2

Verwenden Sie den folgenden Befehl, um alle Zweige zu entfernen (ausgecheckter Zweig wird nicht gelöscht).

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

Bearbeiten: Ich benutze einen Mac Os


0

Wenn Sie unter Windows sind, können Sie Powershell verwenden, um dies zu tun:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

Ersetzen Sie feature/*durch ein beliebiges Muster.


6
grep ist ein nicht erkanntes Cmdlet für mich ... also habe ich mich für diesen Git-Zweig geändert | Dabei gilt: {$ _. Trim (). StartsWith ("bug")} | % {git branch -D $ _. Trim ()} und funktioniert!
Alex


0

Sie können git guimehrere Zweige gleichzeitig löschen. Über Eingabeaufforderung / Bash -> git gui-> Remote -> Zweig löschen ... -> Remote-Zweige auswählen, die Sie entfernen möchten -> Löschen.


0

Ich habe gerade eine große Anzahl veralteter lokaler / entfernter Zweigstellen aufgeräumt.

Unten ist, wie ich es gemacht habe:

1. Listen Sie alle Filialnamen in einer Textdatei auf:

git branch -a >> BranchNames.txt

2. Hängen Sie die zu löschenden Zweige an den Befehl "git branch -D -r" an:

git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03 (... füge alle Filialnamen hinzu)

3. Führen Sie den Befehl cmd aus

Und dieser arbeitet so viel schneller und zuverlässiger als " git push origin --delete" ".

Dies ist möglicherweise nicht der intelligenteste Weg, wie in anderen Antworten aufgeführt, aber dieser ist ziemlich einfach und einfach zu bedienen.


0

Wenn Sie die Git-GUI installiert haben, die ein Standard-Add-On für Windows ist, ist dies die einfachste. Mit Strg können Sie mehrere Zweige auswählen und mit einem Klick löschen.


0

Wenn Sie Fischschale verwenden, können Sie die folgenden stringFunktionen nutzen :

git branch -d (git branch -l "<your pattern>" | string trim)

Dies unterscheidet sich nicht wesentlich von den Powershell-Optionen in einigen anderen Antworten.


0

Wenn Sie alle zu löschenden Zweige in einer Textdatei (branch-to-del.txt) hatten (ein Zweig pro Zeile), können Sie dies tun, um alle diese Zweige von der Fernbedienung (Ursprung) zu löschen: xargs -a branches-to-del.txt git push --delete origin


0

Gehen Sie wie folgt vor, um mehrere Zweige basierend auf einem bestimmten Muster zu löschen:

Öffnen Sie das Terminal oder ein gleichwertiges Terminal und geben Sie die folgenden Befehle ein:

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

Entfernen Sie alle 3.2.x-Zweige, die Sie eingeben müssen

git branch | grep "3.2" | xargs git branch -D

Das ist alles!

Du bist startklar!


-1

Wie in Git sind alle Zweige nichts durch Verweise auf das Git-Repo. Warum löschen Sie nicht einfach die Zweige, die zu gehen, .git/refund wenn etwas ausgelassen wird, das im Repository nicht interessant ist, wird automatisch Müll gesammelt, so dass Sie dies nicht tun müssen sich die Mühe machen.



-4

Sie können alle Zweige entfernen und alle unnötigen Refs entfernen:

rm .git/refs/heads/3.2.*


2
Aus zwei Gründen herabgestuft: 1. Es wird ein Implementierungsdetail verwendet (die Tatsache, dass aktuelle Versionen von Git die Zweige als Dateien in einem bestimmten Verzeichnis speichern). Dies kann sich in zukünftigen Versionen ändern und die Antwort ungültig machen. 2. Es funktioniert nicht, wenn sich das Repository in einem separaten Verzeichnis befindet .
Axiac

Dies führt auch zu sehr unerwarteten Ergebnissen, wenn Sie dies in einem gepackten Repository ( git gc) ausführen . Tu das nicht.
Matthieu Moy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.