Ich folge einem Entwicklungsprozess, in dem ich für jedes neue Feature oder jede neue Story-Karte einen neuen lokalen Zweig erstelle. Wenn ich fertig bin, füge ich den Zweig in Master zusammen und drücke dann.
Was im Laufe der Zeit aufgrund einer Kombination aus Faulheit oder Vergesslichkeit passiert, ist, dass ich am Ende eine große Liste lokaler Zweige habe, von denen einige (wie z. B. Spitzen) möglicherweise nicht zusammengeführt wurden.
Ich weiß, wie man alle meine lokalen Zweige auflistet und wie man einen einzelnen Zweig entfernt, aber ich habe mich gefragt, ob es einen git-Befehl gibt, mit dem ich alle meine lokalen Zweige löschen kann.
Unten ist die Ausgabe des git branch --merged
Befehls.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Alle Versuche, Zweige zu löschen, die mit grep -v \*
(gemäß den folgenden Antworten) aufgelistet sind, führen zu Fehlern:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Ich benutze:
git 1.7.4.1
ubuntu 10.04
GNU bash, Version 4.1.5 (1) - Release
GNU grep 2.5.4
Antworten:
Der Unterbefehl 'git branch -d' kann mehr als einen Zweig löschen. Vereinfachen Sie also die Antwort von @ sblom, fügen Sie jedoch ein kritisches xargs hinzu:
oder weiter vereinfacht zu:
Wie von @AndrewC erwähnt,
git branch
wird davon abgeraten, Skripte zu verwenden . Um dies zu vermeiden, verwenden Sie Folgendes:Vorsicht beim Löschen geboten!
quelle
error:branch 'STORY-123-Short-Description' not found.
für jede der aufgeführten Niederlassungen.error:branch 'STORY-123-Short-Description' not found.
Fehlermeldung erhalten, liegt dies wahrscheinlich an den Einstellungen für die Git-Farbe. Dies funktionierte für mich (beachten Sie die--no-color
Option):git branch --no-color --merged | grep -v \* | xargs git branch -D
Ich habe einen schöneren Weg in einem Kommentar zu diesem Thema auf Github gefunden :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
Bearbeiten: Option ohne Farbe hinzugefügt und Ausschluss eines stabilen Zweigs (andere Zweige nach Bedarf in Ihrem Fall hinzufügen)
quelle
error: branch 'my-branch-name' not found.
für jeden Zweig bekommen. Verwenden der Git-Version 1.8.3.4 (Apple Git-47). Irgendeine Idee warum?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
Das Parsen der Ausgabe von
git branch
wird nicht empfohlen und ist keine gute Antwort für zukünftige Leser von Stack Overflow.git branch
ist ein sogenannter Porzellanbefehl. Porzellanbefehle können nicht maschinell analysiert werden, und die Ausgabe kann sich zwischen verschiedenen Git-Versionen ändern.git branch
, dass das Parsen schwierig wird (z. B. Kolorierung). Wenn ein Benutzer festgelegt hat, erhaltencolor.branch
Sie Steuercodes in der Ausgabe. Dies führt dazu,error: branch 'foo' not found.
wenn Sie versuchen, sie in einen anderen Befehl weiterzuleiten. Sie können dies mit dem--no-color
Flag to umgehengit branch
, aber wer weiß, welche anderen Benutzerkonfigurationen möglicherweise Probleme verursachen.git branch
kann andere Dinge tun, die beim Parsen ärgerlich sind, z. B. ein Sternchen neben den aktuell ausgecheckten Zweig setzenDer Betreuer von git hat dies über das Scripting um die
git branch
Ausgabe zu sagenAntworten, die darauf hindeuten, Dateien im
.git
Verzeichnis manuell zu bearbeiten (z. B. .git / refs / Heads), sind ähnlich problematisch (Refs befinden sich möglicherweise stattdessen in .git / Packed-Refs, oder Git ändert möglicherweise in Zukunft das interne Layout).Git bietet den
for-each-ref
Befehl zum Abrufen einer Liste von Zweigen.Git 2.7.X führt die
--merged
Option ein, damit Sie wie folgt vorgehen können , um alle zusammengeführten Zweige zu finden und zu löschenHEAD
Ab Git 2.6.X müssen Sie alle lokalen Zweige auflisten und sie dann einzeln testen, um festzustellen, ob sie zusammengeführt wurden (was erheblich langsamer und etwas komplizierter ist).
quelle
git branch --no-color 2>/dev/null
?git branch
jedoch ein Porzellanbefehl, und es gibt keine Garantie dafür, dass sich die Ausgabe in einer zukünftigen Version von git nicht ändert.Der einfachere Weg, alle Zweige zu löschen, aber andere wie "Entwickeln" und "Master" beizubehalten, ist der folgende:
sehr hilfreich !
quelle
So löschen Sie jeden Zweig außer dem, den Sie gerade ausgecheckt haben:
Ich würde empfehlen
git branch -D $b
,echo $b
die ersten Male zu wechseln , um sicherzustellen, dass die von Ihnen beabsichtigten Zweige gelöscht werden.quelle
error:branch 'a_branch_name' not found.
kann ich sehen, was Sie versuchen, und ich habe mit dem Befehl herumgespielt, aber aus irgendeinem Grund scheint Git die angegebenen Zweignamen nicht zu mögen ...git branch --merged
STORY-123-Short-Description
git branch --merged
, bekommst du eine Liste mit einer davon in jeder Zeile?error:branch 'a_branch_name' not found.
? Oder beschwert es sich über einen der Zweignamen aus Ihrergit branch
obigen Ausgabe?Mit dem folgenden Befehl werden alle lokalen Zweige außer dem Hauptzweig gelöscht.
Der obige Befehl
quelle
git branch | grep -v "master" | xargs git branch -d
zuerst verwenden, damit ich nicht zusammengeführte Zweige lösche, nur um sicher zu gehen. Aber schöne Antwort!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Nur eine Anmerkung, ich würde auf Git 1.7.10 upgraden. Möglicherweise erhalten Sie hier Antworten, die für Ihre Version nicht funktionieren. Ich vermute, dass Sie dem Filialnamen ein Präfix voranstellen müssten
refs/heads/
.VORSICHT Fahren Sie nur dann mit den folgenden Schritten fort, wenn Sie eine Kopie Ihres Arbeitsordners und Ihres .git-Verzeichnisses erstellt haben.
Manchmal lösche ich einfach die Zweige, aus denen ich nicht direkt möchte
.git/refs/heads
. Alle diese Zweige sind Textdateien, die die 40 Zeichen sha-1 des Commits enthalten, auf das sie verweisen. Sie haben irrelevante Informationen in Ihrem,.git/config
wenn Sie für eines von ihnen ein spezifisches Tracking eingerichtet haben. Sie können diese Einträge auch manuell löschen.quelle
Versuchen Sie den folgenden Shell-Befehl:
Erläuterung:
git branch | grep -v "master"
Befehlxargs
Befehl ausxargs git branch -D
quelle
So löschen Sie alle lokalen Zweige unter Linux außer dem, auf dem Sie sich befinden
quelle
Ich fand es einfacher, nur Texteditor und Shell zu verwenden.
git checkout <TAB>
Shell ein. Zeigt alle lokalen Niederlassungen an.git branch -D <PASTE THE BRANCHES NAMES HERE>
.Das ist es.
quelle
Ich hatte eine ähnliche Situation und fand kürzlich den folgenden Befehl nützlich.
Wenn Sie mehrere Zweige behalten möchten, dann
hoffe das hilft jemandem.
quelle
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
Eigentlich glaube ich, dass Sie sie ursprünglich hatten, aber sie gingen in der SO-Formatierung verloren.Löschen Sie in der Windows-Befehlszeile alle außer dem aktuell ausgecheckten Zweig mit:
quelle
Wenn Sie Git selbst nicht durchlaufen müssen, können Sie Köpfe auch manuell oder programmgesteuert unter .git / refs / head löschen . Folgendes sollte mit minimalen Optimierungen unter Bash funktionieren:
Dadurch wird jeder lokale Zweig außer Ihrem Hauptzweig gelöscht. Da Ihre Upstream-Filialen unter .git / refs / remotes gespeichert sind , bleiben sie unberührt.
Wenn Sie Bash nicht verwenden oder viele Git-Repositorys gleichzeitig rekursieren möchten, können Sie mit GNU find etwas Ähnliches tun:
Die Suchlösung ist wahrscheinlich portabler, aber das Bereinigen von Pfaden und Dateinamen ist schwierig und möglicherweise fehleranfälliger.
quelle
Keine der Antworten hat meine Bedürfnisse voll erfüllt, also los geht's:
Dadurch werden alle Ortsvereine löschen , die zusammengeführt werden und beginnend mit
feature/
,bugfix/
oderhotfix/
. Anschließend wird die Upstream-Fernbedienungorigin
beschnitten (möglicherweise müssen Sie ein Kennwort eingeben).Funktioniert auf Git 1.9.5.
quelle
Basierend auf einer Kombination mehrerer Antworten hier - Wenn Sie alle Zweige, die auf der Fernbedienung vorhanden sind , behalten, aber den Rest löschen möchten, reicht der folgende Oneliner aus:
quelle
Obwohl dies keine Befehlszeilenlösung ist, bin ich überrascht, dass die Git-GUI noch nicht vorgeschlagen wurde.
Ich benutze die Befehlszeile 99% der Zeit, aber in diesem Fall ist sie entweder viel zu langsam (daher die ursprüngliche Frage), oder Sie wissen nicht, was Sie löschen werden, wenn Sie auf eine langwierige, aber clevere Shell-Manipulation zurückgreifen.
Die Benutzeroberfläche löst dieses Problem, da Sie die zu entfernenden Zweige schnell abhaken und an die Zweige erinnert werden können, die Sie behalten möchten, ohne für jeden Zweig einen Befehl eingeben zu müssen.
Gehen Sie auf der Benutzeroberfläche zu Zweig -> Löschen und Strg + Klicken Sie auf die Zweige, die Sie löschen möchten, damit sie hervorgehoben werden. Wenn Sie sicher sein möchten, dass sie zu einem Zweig zusammengeführt werden (z. B.
dev
), klicken Sie unter Nur löschen, wenn Zusammengeführt, um den lokalen Zweig auf zu setzendev
. Andernfalls setzen Sie es auf Immer , um diese Prüfung zu ignorieren.quelle
Für Powershell funktioniert dies:
quelle
Das folgende Skript löscht Zweige. Verwenden Sie es und ändern Sie es auf eigenes Risiko usw. usw.
Basierend auf den anderen Antworten in dieser Frage habe ich mir ein schnelles Bash-Skript geschrieben. Ich habe es "gitbd" (git branch -D) genannt, aber wenn Sie es verwenden, können Sie es nach Belieben umbenennen.
Es wird angeboten, alle Zweige zu löschen, die mit einem Musterargument übereinstimmen, wenn sie übergeben werden, oder alle lokalen Zweige, wenn sie ohne Argumente aufgerufen werden. Es gibt Ihnen auch einen Bestätigungsschritt, da wir Dinge löschen, also ist das schön.
Es ist irgendwie dumm - wenn es keine Zweige gibt, die dem Muster entsprechen, merkt es es nicht.
Ein Beispiel für einen Ausgabelauf:
quelle
Ich habe ein Shell-Skript geschrieben, um alle lokalen Zweige außer zu entfernen
develop
quelle
Die obigen Antworten funktionieren einwandfrei. Hier ist ein anderer Ansatz, wenn wir viele Zweige im lokalen Repo haben und viele Zweige löschen müssen, außer wenige, die auf dem lokalen Computer liegen.
Zuerst
git branch
werden alle lokalen Niederlassungen aufgelistet.So transponieren Sie die Spalte mit den Verzweigungsnamen in eine einzelne Zeile in der Datei, indem Sie einen Unix-Befehl ausführen .
git branch > sample.txt
Dadurch wird sie in der Datei sample.txt gespeichert. Führen Sie den
awk 'BEGIN { ORS = " " } { print }' sample.txt
Befehl in der Shell aus. Dadurch wird die Spalte in eine Zeile umgewandelt und die Liste der Zweignamen in eine einzelne Zeile kopiert.
Und dann renn
git branch -D branch_name(s)
.Dadurch werden alle aufgelisteten Zweige gelöscht, die in local vorhanden sind
quelle
Der pragmatischste Weg:
master
Stellen Sie sicher, dass Sie keine nicht festgeschriebene Arbeit haben, legen Sie bei Bedarf fest / pushen Sie, klonen Sie eine neue Kopie des Repositorys und löschen Sie die alte.quelle
Zu diesem Zweck können Sie Git-Extras verwenden
quelle
Ich habe kein Grep oder anderes Unix auf meiner Box, aber dies funktionierte vom VSCode-Terminal aus:
git branch -d $(git branch).trim()
Ich verwende das Kleinbuchstaben d, damit nicht zusammengeführte Zweige nicht gelöscht werden.
Ich war auch auf Master, als ich es tat,
* master
existiert also nicht, also hat es nicht versucht, Master zu löschen.quelle
master
aktiviert, wird dieser Befehl gelöschtmaster
.Stellen Sie sicher, dass Sie dies zuerst tun
Wenn Sie alle Informationen zu Remote-Zweigen haben, entfernen Sie mit dem folgenden Befehl jeden einzelnen Zweig außer Master
quelle