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.

Doug
quelle
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\..*'`
Slebetman
quelle
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
Carl Norum
quelle
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\*`
gawi
quelle
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.*'`
50shadesofbae
quelle
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 .

KJ Gor
quelle
28

Verwenden

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D
Jakub Narębski
quelle
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.

Adi
quelle
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-*'`
Alan Tweedie
quelle
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.

Efpophis
quelle
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 .

Imtiaz Shakil Siddique
quelle
6

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

    git branch | grep -v "develop" | xargs git branch -D 
Daniel
quelle
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!

Logan
quelle
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

Yulin
quelle
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.
Chaos Crafter
quelle
3

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

Codevision
quelle
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

Velastiqui
quelle
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

ILYAS_Kerbal
quelle
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.

Mo Valipour
quelle
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.

Terry Truong
quelle
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.

RainCast
quelle
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.

Peiz
quelle
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.

mdiin
quelle
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

code4kix
quelle
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!

Ankit Jindal
quelle
-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.

Debajit
quelle
-3

git branch -D <branchName>

Aakash Pahuja
quelle
-4

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

rm .git/refs/heads/3.2.*

Artur Owczarek
quelle
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