Ich möchte meine lokale Repository bereinigen, die eine Tonne von Altarmen hat: zum Beispiel 3.2
, 3.2.1
, 3.2.2
etc.
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.
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 (vongit branch
in diesem Fall).$()
- bedeutet, das Ergebnis auszuführen und zu platzieren.|
- Verkettung.-D
es sich um eine erzwungene Löschung handelt, sollte-d
in den meisten Fällen verwendet werden, um zuerst sicherer zu sein.Antworten:
Nicht mit dieser Syntax. Aber Sie können es so machen:
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:
quelle
git branch -D/-d
funktioniert gut für mich. Vielleicht möchten Sie Ihre aktualisieren (möglicherweise aus dem neuesten git.git Contrib-Verzeichnis).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 esgit branch
eine hübsche Ausgabe mit Dingen wie*
und->
(für Symrefs) hat, die Sie in Skripten / Einzeilern durcheinander bringen können.grep
geeinigt, immer die Flagge einzuschließen--color=always
-git branch -D
warf,error: branch 'my_branch' not found.
bis ich ohne die Farbflagge lief.git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}
, um alle drei Zweige zu löschen. Gnu.org/software/bash/manual/html_node/Brace-Expansion.htmlNun, im schlimmsten Fall könnten Sie verwenden:
quelle
| xargs git branch -d
Teil zu laufen , um zu überprüfen, was tatsächlich gelöscht wird.grep
die Ausgabe vongit branch
, da es zum Lesen gedacht ist, nicht zum Parsen. Kann sich jederzeit ändern. Verwenden Sie diefor-each-ref
zusammen mit den--format
Parametern, wie in anderen Antworten vorgeschlagen, und kombinieren Sie sie dann mit den Vorschlägen in dieser Antwort.BEARBEITEN:
Eine sicherere Version (vorgeschlagen von Jakub Narębski und Jefromi), da die Ausgabe von Git-Zweigen nicht für die Skripterstellung vorgesehen ist:
... oder die xargs-freien:
quelle
git branch
Ausgabe nicht für Skripte. Verwenden Siegit for-each-ref
.git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
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
-D
es sich um eine erzwungene Löschung handelt, sollte-d
in den meisten Fällen verwendet werden, um zuerst sicherer zu sein.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:
quelle
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.gitconfig
obwohl ...git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
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:
Diese Lösung ist fantastisch und wenn Sie eine vollständige Erklärung jedes Befehls und seiner Funktionsweise wünschen, finden Sie ihn hier .
quelle
Verwenden
quelle
alias grefs='git for-each-ref --format="%(refname:short)"'
damit ich es dann tun kanngrefs | grep 'regexpattern' | xargs git branch -D
Vielleicht finden Sie dies nützlich:
Wenn Sie alle Zweige entfernen möchten, die nicht "master", "foo" und "bar" sind,
grep -v 'etwas' ist ein Matcher mit Inversion.
quelle
-D
Option im Vergleich zu anderen Antworten. Danke für die Antwort hier @Adi. Lösungen funktionieren bei mir.Genau aus diesem Grund setze ich meine Initialen und einen Bindestrich (at-) als erste drei Zeichen des Zweignamens ein:
quelle
Wenn Sie nicht nur die Eingabeaufforderung git
git gui
verwenden 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.quelle
Powershell-Lösung:
Wenn Sie Windows ausführen, können Sie mit PowerShell mehrere Zweige gleichzeitig entfernen ...
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 .
quelle
Behalten Sie "Entwickeln" bei und löschen Sie alle anderen lokal
quelle
Ich habe eine kleine Funktion erstellt, die aufgrund der Antwort von @gawi (oben) nützlich sein könnte.
Fügen Sie das zu Ihrem hinzu
.bash_profile
und starten Sie Ihr Terminal neu. Dann können Sie über die Befehlszeile wie folgt aufrufen: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
-d
zu-D
und es wird alles mit dem Präfix gelöscht, unabhängig davon!quelle
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
quelle
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 ...
Verwenden Sie -D, um Löschvorgänge zu erzwingen (wie üblich).
Zur besseren Lesbarkeit ist hier die Zeile für Zeile aufgeschlüsselt ...
Hier ist der Xargs-Ansatz ...
endlich möchte ich das in meiner .bashrc haben
Auf diese Weise kann ich nur sagen
quelle
Für reine Seelen, die PowerShell verwenden, hier das kleine Skript
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
quelle
es funktioniert richtig für mich:
Löschen Sie alle lokalen Zweige
quelle
Verwenden Sie den folgenden Befehl, um alle Zweige zu entfernen (ausgecheckter Zweig wird nicht gelöscht).
Bearbeiten: Ich benutze einen Mac Os
quelle
Wenn Sie unter Windows sind, können Sie Powershell verwenden, um dies zu tun:
Ersetzen Sie
feature/*
durch ein beliebiges Muster.quelle
Sie können diesen Befehl verwenden:
git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
quelle
Sie können
git gui
mehrere Zweige gleichzeitig löschen. Über Eingabeaufforderung / Bash ->git gui
-> Remote -> Zweig löschen ... -> Remote-Zweige auswählen, die Sie entfernen möchten -> Löschen.quelle
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.
quelle
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.
quelle
Wenn Sie Fischschale verwenden, können Sie die folgenden
string
Funktionen nutzen :Dies unterscheidet sich nicht wesentlich von den Powershell-Optionen in einigen anderen Antworten.
quelle
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
quelle
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:
Entfernen Sie alle 3.2.x-Zweige, die Sie eingeben müssen
Das ist alles!
Du bist startklar!
quelle
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/ref
und 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.quelle
git branch -D <branchName>
quelle
Sie können alle Zweige entfernen und alle unnötigen Refs entfernen:
rm .git/refs/heads/3.2.*
quelle
git gc
) ausführen . Tu das nicht.