Gibt es eine einfache Möglichkeit, alle Tracking-Zweige zu löschen, deren Remote-Äquivalent nicht mehr vorhanden ist?
Beispiel:
Niederlassungen (lokal und remote)
- Meister
- Herkunft / Meister
- origin / bug-fix-a
- origin / bug-fix-b
- origin / bug-fix-c
Vor Ort habe ich nur eine Hauptniederlassung. Jetzt muss ich an Bug-Fix-A arbeiten , also überprüfe ich es, arbeite daran und übertrage Änderungen auf die Fernbedienung. Als nächstes mache ich dasselbe mit Bug-Fix-B .
Niederlassungen (lokal und remote)
- Meister
- Bug-Fix-a
- Bug-Fix-b
- Herkunft / Meister
- origin / bug-fix-a
- origin / bug-fix-b
- origin / bug-fix-c
Jetzt habe ich lokale Zweigstellen Master , Bug-Fix-A , Bug-Fix-B . Der Master - Zweig Maintainer wird meine Änderungen in fusionieren Master und löschen Sie alle Zweige er bereits zusammengeführt hat.
Der aktuelle Status ist also jetzt:
Niederlassungen (lokal und remote)
- Meister
- Bug-Fix-a
- Bug-Fix-b
- Herkunft / Meister
- origin / bug-fix-c
Jetzt möchte ich einen Befehl zum Löschen von Zweigen (in diesem Fall Bug-Fix-A , Bug-Fix-B ) aufrufen , die nicht mehr im Remote-Repository vertreten sind.
Es wäre so etwas wie der vorhandene Befehl git remote prune origin
, aber eher so git local prune origin
.
quelle
* master
auf meinem System. Der folgende Befehl hat bei mir funktioniert:git branch -d $(git branch --merged |tail -n +2)
develop
danngit branch --merged
schließtmaster
! Sie möchten das wahrscheinlich (definitiv!) Nicht löschen. Ich denke auch, dass es dort sein sollte,git branch -d
wo Kleinbuchstaben-d
"sicheres Löschen" bedeuten, z. B. nur löschen, wenn zusammengeführt.git branch --merged | grep -v "master" >/tmp/merged-branches && vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches
Nach dem Befehl
Entfernt die Remote-Referenzen, wenn Sie ausgeführt werden
Als Remote-Status wird "weg" angezeigt. Zum Beispiel,
So können Sie ein einfaches Skript schreiben, um lokale Zweige zu entfernen, die entfernt wurden:
Beachten Sie, dass oben der Befehl "Porzellan" verwendet wird
git branch
, um den Upstream-Status abzurufen.Eine andere Möglichkeit, diesen Status zu erhalten, besteht darin, den Befehl "plumbing"
git for-each-ref
mit der Interpolationsvariablen zu verwenden%(upstream:track)
, die[gone]
genau wie oben beschrieben ist.Dieser Ansatz ist etwas sicherer, da kein Risiko besteht, dass ein Teil der Festschreibungsnachricht versehentlich übereinstimmt.
quelle
git branch -vv | gawk '{print $1,$4}' | grep 'gone]' | gawk '{print $1}'
awk '/: gone]/{if ($1!="*") print $1}'
. Dies funktioniert jetzt wie erwartet.test = "!git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done"
Die meisten dieser Antworten beantworten die ursprüngliche Frage nicht. Ich habe ein paar Mal gegraben und dies war die sauberste Lösung, die ich gefunden habe. Hier ist eine etwas gründlichere Version dieser Antwort:
git checkout master
git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Erläuterung:
Funktioniert, indem Sie Ihre Tracking-Zweige beschneiden und dann die lokalen löschen, die anzeigen, dass sie "verschwunden" sind
git branch -vv
.Anmerkungen:
Wenn Ihre Sprache auf etwas anderes als Englisch eingestellt ist, müssen Sie
gone
das entsprechende Wort ändern . Nur lokale Zweige werden nicht berührt. Zweige, die auf der Fernbedienung gelöscht, aber nicht zusammengeführt wurden, zeigen eine Benachrichtigung an, werden jedoch auf lokaler Ebene nicht gelöscht. Wenn Sie diese ebenfalls löschen möchten, wechseln Sie-d
zu-D
.quelle
git checkout master && ...
am Anfang des Befehls hinzufügen .git branch -vv
beginnt die Ausgabe von mit einem Sternchen, der letztendlich zur Ausführung führtgit branch -d *
. Hier ist eine gepatchte Version, die Zeilen mit Sternchen ignoriert:git branch -vv | grep ': gone]'| grep -v "\*" | awk '{ print $1; }' | xargs -r git branch -d
Normalerweise würde ich eine Frage mit 16 Antworten nicht beantworten, aber alle anderen Antworten sind falsch und die richtige Antwort ist so einfach. Die Frage lautet: "Gibt es eine einfache Möglichkeit, alle Tracking-Zweige zu löschen, deren Remote-Äquivalent nicht mehr vorhanden ist?"
Wenn "einfach" bedeutet, alle auf einmal zu löschen, nicht zerbrechlich, nicht gefährlich und ohne Vertrauen auf Tools, die nicht alle Leser haben, lautet die richtige Antwort: Nein.
Einige Antworten sind einfach, aber sie tun nicht das, was gefragt wurde. Andere tun, was gefragt wurde, sind aber nicht einfach: Alle verlassen sich darauf, die Git-Ausgabe über Textmanipulationsbefehle oder Skriptsprachen zu analysieren, die möglicherweise nicht auf jedem System vorhanden sind. Darüber hinaus verwenden die meisten Vorschläge Porzellanbefehle, deren Ausgabe nicht für die Analyse durch Skripte vorgesehen ist ("Porzellan" bezieht sich auf Befehle, die für den menschlichen Betrieb bestimmt sind; Skripte sollten die untergeordneten Befehle "Sanitär" verwenden).
Weiterführende Literatur:
git branch
Ausgabe in einem Skript .git remote prune
,git prune
,git fetch --prune
Wenn Sie dies sicher tun möchten, müssen Sie für den Anwendungsfall in der Frage (Garbage-Collect-Tracking-Zweige, die auf dem Server gelöscht wurden, aber noch als lokale Zweige vorhanden sind) und nur Git-Befehle auf hoher Ebene verwenden
git fetch --prune
(odergit fetch -p
, was ein Alias ist odergit prune remote origin
was dasselbe tut, ohne es abzurufen, und wahrscheinlich nicht das ist, was Sie die meiste Zeit wollen).git branch -v
(jeder verwaiste Verfolgungszweig wird mit "[weg]" markiert).git branch -d [branch_name]
auf jedem verwaisten Tracking-Zweig(was einige der anderen Antworten vorschlagen).
Wenn Sie eine Lösung skripten möchten,
for-each-ref
ist dies Ihr Ausgangspunkt, wie in Mark Longairs Antwort hier und dieser Antwort auf eine andere Frage , aber ich sehe keine Möglichkeit, sie auszunutzen, ohne eine Shell-Skriptschleife zu schreiben oder xargs oder ähnliches zu verwenden .Hintergrunderklärung
Um zu verstehen, was passiert, müssen Sie wissen, dass Sie in der Situation der Nachverfolgung von Zweigen nicht einen Zweig haben, sondern drei. (Und denken Sie daran, dass "Verzweigung" einfach einen Zeiger auf ein Commit bedeutet.)
Bei einem Tracking-Zweig
feature/X
verfügt das Remote-Repository (Server) über diesen Zweig und ruft ihn auffeature/X
. Ihr lokales Repository verfügt über einen Zweig,remotes/origin/feature/X
der bedeutet: "Dies hat mir die Fernbedienung mitgeteilt, dass der Feature- / X-Zweig das letzte Mal war, als wir gesprochen haben". Schließlich verfügt das lokale Repository über einen Zweig,feature/X
der auf Ihr letztes Commit verweist und für den konfiguriert ist "Spur"remotes/origin/feature/X
, was bedeutet, dass Sie ziehen und drücken können, um sie ausgerichtet zu halten.Irgendwann hat jemand das
feature/X
auf der Fernbedienung gelöscht . Von diesem Moment an bleiben Sie bei Ihrem lokalenfeature/X
(was Sie wahrscheinlich nicht mehr wollen, da die Arbeit an Feature X vermutlich abgeschlossen ist) und Ihrem,remotes/origin/feature/X
was sicherlich nutzlos ist, weil sein einziger Zweck darin bestand, sich den Status des Serverzweigs zu merken .Und Git lässt Sie die Redundanz automatisch bereinigen
remotes/origin/feature/X
- das ist es, was esgit fetch --prune
tut - aber aus irgendeinem Grund können Sie Ihre eigenen nicht automatisch löschenfeature/X
... obwohl Ihrefeature/X
noch die verwaisten Tracking-Informationen enthält, so dass sie die Informationen enthalten um frühere Tracking-Zweige zu identifizieren, die vollständig zusammengeführt wurden. (Schließlich können Sie die Informationen erhalten, mit denen Sie die Operation von Hand selbst durchführen können.)quelle
xargs
). Es gibt auchgit alias
eine Reihe von Fällen zu vereinfachen.xargs
oder schlagen nicht alle Git-Benutzer , und sie sind wahrscheinlich nicht hier, um nach einer Herausforderung für die Mikrocodierung zu suchen, sondern um eine schnelle Antwort, die sie sicher anwenden können, ohne sich weiter von ihrem eigentlichen Ziel abzulenken .Ich habe hier die Antwort gefunden: Wie kann ich alle zusammengeführten Git-Zweige löschen?
Stellen Sie sicher, dass wir den Meister behalten
Sie können sicherstellen, dass
master
oder ein anderer Zweig nicht entfernt wird, indem Siegrep
nach dem ersten einen weiteren hinzufügen . In diesem Fall würden Sie gehen:Also , wenn wir wollten , halten
master
,develop
undstaging
zum Beispiel, würden wir gehen:Machen Sie dies zu einem Alias
Da es etwas lang ist, möchten Sie möglicherweise einen Alias zu Ihrem
.zshrc
oder hinzufügen.bashrc
. Meins heißtgbpurge
(fürgit branches purge
):Laden Sie dann Ihr
.bashrc
oder neu.zshrc
:oder
quelle
Windows-Lösung
Für Microsoft Windows Powershell:
git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Erklärung
git checkout master
wechselt in den Hauptzweiggit remote update origin --prune
beschneidet entfernte Zweigegit branch -vv
erhält eine ausführliche Ausgabe aller Zweige ( Git-Referenz )Select-String -Pattern ": gone]"
Ruft nur die Datensätze ab, bei denen sie von der Fernbedienung entfernt wurden.% { $_.toString().Trim().Split(" ")[0]}
Holen Sie sich den Filialnamen% {git branch -d $_}
löscht den Zweigquelle
.Trim()
nach ,.toString()
um vor dem Zweignamen zu entfernen , zwei Räume.git branch -d
,git branch -D
sonst bekomme ich den Fehler, dass der Zweig nicht vollständig zusammengeführt ist.git branch -D
ist destruktiv und löscht lokale Arbeiten, die du noch nicht gepusht hast.-d
ist immer sicher, sei einfach vorsichtig mit-D
.Der Mustervergleich für "weg" in den meisten anderen Lösungen war für mich ein wenig beängstigend. Um sicherer zu sein, wird das
--format
Flag verwendet, um den Upstream-Tracking-Status jedes Zweigs abzurufen .Ich brauchte eine Windows-freundliche Version, damit alle Zweige, die mit Powershell als "weg" aufgeführt sind, gelöscht werden:
In der ersten Zeile wird der Name der lokalen Zweige aufgeführt, deren vorgelagerter Zweig "weg" ist. In der nächsten Zeile werden leere Zeilen entfernt (die für Zweige ausgegeben werden, die nicht "weg" sind). Anschließend wird der Zweigname an den Befehl zum Löschen des Zweigs übergeben.
quelle
--format
Option scheint ziemlich neu zu sein; Ich musste git von 2.10.something auf 2.16.3 aktualisieren, um es zu bekommen. Dies ist meine Modifikation für Linux-ish Systeme:git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)" | sed 's,^refs/heads/,,' | grep . | xargs git branch -D
refname:short
. Dann können Sie die Zeile löschen% { $_ -replace '^refs/heads/', '' }
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" | where { $_ -ne "" } | foreach { git branch -d $_ }
auch wahrscheinlich eine gute Idee zu verwenden ,-d
statt-D
. Das Löschen erzwingen sollte nicht für Zweige erforderlich sein, die sich nicht mehr auf der Fernbedienung befinden.Entfernen Sie alle Zweige, die zum Master zusammengeführt wurden, aber versuchen Sie nicht, den Master selbst zu entfernen:
git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)
oder fügen Sie einen Alias hinzu:
alias gitcleanlocal="git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)"
Erläuterung:
git checkout master
Checkout-Hauptzweiggit pull origin master
Stellen Sie sicher, dass in der lokalen Niederlassung alle Remote-Änderungen zusammengeführt wurdengit fetch -p
Entfernen Sie Verweise auf gelöschte Remote-Zweigegit branch -d $(git branch master --merged | grep master -v)
Löschen Sie alle Zweige, die zum Master zusammengeführt wurden, aber versuchen Sie nicht, den Master selbst zu entfernenquelle
git branch -D
git branch -d
die eine Warnung vor nicht geschobenen Zweigen ausgeben sollten.Dies wird beschneidet alle Zweige , dass nicht mehr existiert auf der Fernbedienung.
quelle
X
. dugit checkout X
; Jetzt verfügt Ihr Repository über einen (lokalen) Tracking-ZweigX
und einen Remote-Zweigorigin/X
. Das Remote-Repository wird gelöschtX
. dugit fetch-p
; in Ihrem lokalen Repository wurden nicht nur,origin/X
sondern auchX
gelöscht. Sagst du das?Noch eine weitere Antwort für den Stapel, die sich stark auf Patricks Antwort stützt (was mir gefällt, weil sie jegliche Unklarheit darüber zu beseitigen scheint, wo
gone]
in dergit branch
Ausgabe übereinstimmen wird), aber eine * nix-Biegung hinzufügt.In seiner einfachsten Form:
Ich habe dies in ein
git-gone
Skript auf meinem Weg eingepackt :NB - Die
--format
Option scheint ziemlich neu zu sein. Ich musste git von 2.10.something auf 2.16.3 aktualisieren, um es zu bekommen.EDIT: optimiert, um Vorschläge
refname:short
von Benjamin W. aufzunehmen.NB2 - Ich habe nur in getestet
bash
, daher der Hashbang, aber wahrscheinlich portabel zush
.quelle
sed
Teil nicht überspringen, indem Sie es%(refname:short)
in der ersten Zeile verwenden?--format
. Eine andere Möglichkeit, dassed
Teil zu überspringen, ist die Verwendunggit update-ref -d
. Beachten Sie, dass dies wahrscheinlich etwas unsicher ist. Die Verwendunggit for-each-ref
ist hier sicherer (angegeben--shell
).--format
ich damit zapple , dies selbst zu tun. Nur eine Frage: Warum die#!bash
? Alles hier siehtsh
für mich wie tragbar aus .Könnte für einige einfache Zeilen nützlich sein, um alle lokalen Zweige außer Master und Entwicklung zu löschen
quelle
'git branch | grep -v "master" | grep -v "develop"
solchen Dingen spielen kann, bevor man sich dazu verpflichtet, den Löschteil des Befehls hinzuzufügen. 👏😊Dadurch werden alle zusammengeführten lokalen Verzweigungen mit Ausnahme der lokalen Hauptreferenz und der aktuell verwendeten gelöscht:
Dadurch werden alle Zweige gelöscht, die bereits aus dem Remote-Repository entfernt wurden, auf das durch " origin " , die jedoch lokal in " remotes / origin " verfügbar sind .
quelle
git branch -vv | grep 'gone]' | grep -v "\*" | awk '{print $1}' | xargs -r git branch -d
Erläuterung: Ich ziehe es vor, dasgit branch --merged
durchgit branch -vv
zu ersetzen , um den Statusgit branch --merged
Ich glaube nicht, dass es einen eingebauten Befehl gibt, um dies zu tun, aber es ist sicher, Folgendes zu tun:
Wenn Sie verwenden
-d
, weigert sich git, den Zweig zu löschen, es sei denn, er wird vollständig in den ZweigHEAD
oder den vorgelagerten Fernverfolgungszweig zusammengeführt. Sie können also jederzeit die Ausgabe vongit for-each-ref
durchlaufen und versuchen, jeden Zweig zu löschen. Das Problem bei diesem Ansatz ist, dass ich vermute, dass Sie wahrscheinlich nichtbug-fix-d
gelöscht werden möchten , nur weil esorigin/bug-fix-d
seinen Verlauf enthält. Stattdessen können Sie ein Skript wie das folgende erstellen:Warnung: Ich habe dieses Skript nicht getestet - nur mit Vorsicht verwenden ...
quelle
TL; DR:
Entfernen Sie ALLE lokalen Zweige, die sich nicht auf der Fernbedienung befinden
Entfernen Sie ALLE lokalen Zweige, die sich nicht auf Remote befinden UND die vollständig zusammengeführt sind UND die nicht wie in vielen Antworten zuvor verwendet verwendet wurden.
Erläuterung
git fetch -p
beschneidet alle Zweige, die auf der Fernbedienung nicht mehr vorhanden sindgit branch -vv
druckt lokale Zweige und beschnittene Zweige werden mit markiertgone
grep ': gone]'
Wählt nur den Zweig aus, der weg istawk '{print $1}'
Filtern Sie die Ausgabe, um nur den Namen der Zweige anzuzeigenxargs git branch -D
wird alle Linien (Zweige) durchlaufen und diesen Zweig zwangsweise entfernenWarum
git branch -D
und nichtgit branch -d
sonst haben Sie für Zweige, die nicht vollständig zusammengeführt sind.quelle
Sie könnten dies tun:
quelle
Basierend auf den obigen Informationen hat dies bei mir funktioniert:
Es werden alle lokalen Zweige entfernt, die sich
': gone] '
auf der Fernbedienung befinden.quelle
gone
deren Name eine beliebige Stelle enthält.Mit dem obigen Befehl können Zweige abgerufen werden, die in Remote zusammengeführt und gelöscht werden, und der lokale Zweig wird gelöscht, der in Remote nicht mehr verfügbar ist
quelle
grep gone <(git branch -v) | cut -d ' ' -f 3 | xargs git branch -D
um das Löschen aller zu erzwingengone
irgendwo in ihnen enthält (zusingonefunction
. B. ).Nichts davon war wirklich richtig für mich. Ich wollte etwas, das alle lokalen Zweige löscht, die einen Remote-Zweig verfolgen, auf
origin
dem der Remote-Zweig gelöscht wurde (gone
). Ich wollte keine lokalen Zweige löschen, die nie für die Verfolgung eines Remote-Zweigs eingerichtet wurden (dh meine lokalen Entwicklungszweige). Außerdem wollte ich einen einfachen Einzeiler, der nur verwendetgit
, oder andere einfache CLI-Tools, anstatt benutzerdefinierte Skripte zu schreiben. Am Ende habe ich ein bisschen vongrep
und verwendetawk
, um diesen einfachen Befehl zu machen.Dies ist letztendlich das, was in meinem endete
~/.gitconfig
:Hier ist ein
git config --global ...
Befehl zum einfachen Hinzufügengit prune-branches
:HINWEIS: Im Befehl config verwende ich die
-d
Optiongit branch
anstatt-D
wie in meiner eigentlichen Konfiguration. Ich benutze,-D
weil ich nicht will, dass Git sich über nicht zusammengeführte Zweige beschwert. Möglicherweise möchten Sie diese Funktionalität auch. Wenn ja, verwenden Sie einfach-D
statt-d
am Ende dieses Konfigurationsbefehls.quelle
git branch -vv
Kurze Frage: Warum tun und greifen: gone]
und nicht tungit branch -v
und greifen[gone]
?v
. Wenn esgit branch -v | grep '[gone]'
für Sie funktioniert, machen Sie es. Es scheint ein bisschen sauberer.Basierend auf Git Tipp: Löschen alter lokaler Zweige , der der Lösung von jason.rickman ähnelt. Zu diesem Zweck habe ich einen benutzerdefinierten Befehl namens git gegangen, der mit Bash weg ist :
git gone -pn
kombiniert das Beschneiden und Auflisten der "verschwundenen" Zweige:Dann können Sie mit
git gone -d
oder den Abzug betätigengit gone -D
.Anmerkungen
"$BRANCH/.*: gone]"
wo$BRANCH
normalerweiseorigin
. Dies wird wahrscheinlich nicht funktionieren, wenn Ihre Git-Ausgabe auf Französisch usw. lokalisiert ist.quelle
git gone
sieht aus wie ein Alias fürgit branch -vv | grep 'origin/.*: gone]' | awk '{print $1}' | xargs git branch -d
, der das Problem des OP löst.Zeichnung stark von einer Reihe von anderen Antworten hier, ich habe mit dem folgenden (nur git 2.13 und höher, glaube ich) endete, die auf jedem UNIX-ähnliche Shell funktionieren sollen:
Dies verwendet insbesondere
for-each-ref
anstelle vonbranch
(wiebranch
es ein "Porzellan" -Befehl ist, der für eine vom Menschen lesbare Ausgabe und nicht für eine maschinelle Verarbeitung entwickelt wurde) und verwendet sein--shell
Argument, um eine ordnungsgemäß maskierte Ausgabe zu erhalten (dies ermöglicht es uns, uns keine Gedanken über ein Zeichen im Referenznamen zu machen).quelle
[ ! -z "$ref" ]
bedeutet. Ich denke, ein Multi-Liner hätte schon geholfen. Trotzdem danke für deine Eingabe!Noch eine Antwort, denn keine der Lösungen entspricht meinen Anforderungen an Eleganz und Plattformübergreifend:
Befehl zum Löschen lokaler Zweige, die sich nicht auf der Fernbedienung befinden:
So integrieren Sie es in gitconfig, damit es ausgeführt werden kann mit
git branch-prune
:Bash
Power Shell
(Benötigen Sie Hilfe bei der Suche nach einem universellen Befehl für PowerShell und Bash)
Warum ist diese Antwort die beste?
git branch-prune
Ihrem Git einen Befehl hinzugit for-each-ref
--filter
ohne externe AbhängigkeitenErläuterung:
~\.gitconfig
. Nachdem Sie dies ausgeführt haben, können Sie es einfach tungit branch-prune
--prune
Flagge ab, die "Fernverfolgungszweige nicht mehr auf der Fernbedienung beschneidet".git for-each-ref
und--filter
, um eine Liste der Zweige zu erhalten, sind[gone]
(keine Fernbedienung)quelle
Ich habe mir dieses Bash-Skript ausgedacht. Es bleibt immer die Zweige
develop
,qa
,master
.quelle
Ich verwende eine kurze Methode, um den Trick auszuführen. Ich empfehle Ihnen, dasselbe zu tun, da dies einige Stunden sparen und Ihnen mehr Sichtbarkeit geben könnte
Fügen Sie einfach das folgende Snippet zu Ihrem .bashrc hinzu (.bashprofile on macos).
Sie müssen den Grep-Regex bearbeiten, um ihn Ihren Anforderungen anzupassen (hier wird verhindert, dass Master, Preprod und DMZ gelöscht werden).
quelle
git fetch --all --prune
hat den Trick gemacht. Vielen Dank!Das hat bei mir funktioniert:
quelle
Ich bin mir nicht sicher, wie lange, aber ich benutze jetzt Git-Up, das sich darum kümmert.
Ich tue es
git up
und es beginnt, neue Zweige zu verfolgen und die alten zu löschen.Nur um es klar zu machen, es ist kein sofort einsatzbereiter git-Befehl - https://github.com/aanand/git-up
Übrigens verstaut es auch schmutzigen Baum und macht Rebases immer noch mit nur
git up
.Hoffe, es wird für jemanden nützlich sein
quelle
Hier ist eine Lösung, die ich für die Fischschale verwende. Getestet auf
Mac OS X 10.11.5
,fish 2.3.0
undgit 2.8.3
.Ein paar Anmerkungen:
Stellen Sie sicher, dass Sie die richtige Einstellung vornehmen
base_branch
. In diesem Fall verwende ichdevelop
als Basiszweig, aber es könnte alles sein.Dieser Teil ist sehr wichtig:
grep -v "\(master\|$base_branch\|\*\)"
. Es stellt sicher, dass Sie weder den Master noch Ihren Basiszweig löschen.Ich verwende dies
git branch -d <branch>
als zusätzliche Vorsichtsmaßnahme, um keinen Zweig zu löschen, der nicht vollständig mit dem vorgelagerten oder aktuellen HEAD zusammengeführt wurde.Eine einfache Möglichkeit zum Testen ist das Ersetzen
git branch -d $f
durchecho "will delete $f"
.Ich sollte wohl auch hinzufügen: VERWENDUNG AUF EIGENES RISIKO!
quelle
Ich habe ein Python-Skript mit GitPython geschrieben , um lokale Zweige zu löschen, die auf Remote nicht vorhanden sind.
Hoffe, jemand findet es nützlich, bitte fügen Sie Kommentare hinzu, wenn ich etwas verpasst habe.
quelle
Wenn Sie
zsh
Shell mit verwendenOh My Zsh
installierter Funktion verwenden, können Sie dies am einfachsten sicher tun, die integrierte automatische Vervollständigung verwenden.Bestimmen Sie zunächst, mit welchen Zweigen Sie löschen möchten:
Dies zeigt Ihnen eine Liste bereits zusammengeführter Zweige
Nachdem Sie einige kennen, die Sie löschen möchten, geben Sie Folgendes ein:
Alles was Sie tun müssen, ist [Tab] zu drücken und es wird eine Liste der lokalen Niederlassungen angezeigt. Verwenden Sie die Tabulatortaste oder drücken Sie erneut die Tabulatortaste, und Sie können sie durchlaufen, um einen Zweig mit der Eingabetaste auszuwählen.
Registerkarte Wählen Sie die Zweige immer wieder aus, bis Sie eine Liste der Zweige haben, die Sie löschen möchten:
Drücken Sie jetzt einfach die Eingabetaste, um Ihre Sammlung von Zweigen zu löschen.
Wenn Sie zsh nicht auf Ihrem Terminal verwenden ... Holen Sie es sich hier.
quelle
Ich benutze gerne Pipes, weil es den Befehl leichter lesbar macht.
Dies ist meine Lösung, wenn Sie alle Zweige außer Master entfernen möchten.
Ändern Sie den ersten und zweiten Block, um andere Zweige zu löschen, die Ihren Kriterien entsprechen.
quelle
Hier ist die einfache Antwort, die für mich mit einem Git-Client funktioniert hat:
Löschen Sie das Repository vollständig von Ihrem Computer und checken Sie es erneut aus.
Kein Herumspielen mit riskanten Skripten.
quelle