Mit git remote prune origin
kann ich die lokalen Zweige entfernen, die sich nicht mehr auf der Fernbedienung befinden.
Ich möchte aber auch lokale Zweige entfernen, die aus diesen entfernten Zweigen erstellt wurden (eine Überprüfung, ob sie nicht zusammengeführt sind, wäre hilfreich).
Wie kann ich das machen?
npx git-removed-branches
(Trockenlauf) odernpx git-removed-branches --prune
(echt). Sie müssen node.js bereits installiert haben. Siehe Antworten unten für Details.Antworten:
Nach dem Beschneiden können Sie die Liste der Remote-Zweige mit abrufen
git branch -r
. Die Liste der Zweige mit ihrem Fernverfolgungszweig kann mit abgerufen werdengit branch -vv
. Wenn Sie diese beiden Listen verwenden, können Sie die Fernverfolgungszweige finden, die nicht in der Liste der Fernbedienungen enthalten sind.Diese Zeile sollte den Trick machen (erfordert
bash
oderzsh
funktioniert nicht mit der Standard-Bourne-Shell):git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
Diese Zeichenfolge ruft die Liste der entfernten Zweige ab und übergibt sie
egrep
über die Standardeingabe. Und filtert die Zweige, die einen Remote-Tracking-Zweig haben (unter Verwendunggit branch -vv
und Filtern für diejenigen, die einen habenorigin
), und erhält dann die erste Spalte dieser Ausgabe, die der Zweigname ist. Übergeben Sie schließlich alle Zweignamen an den Befehl delete branch.Da die
-d
Option verwendet wird, werden keine Zweige gelöscht, die nicht mit dem Zweig zusammengeführt wurden, in dem Sie sich befinden, wenn Sie diesen Befehl ausführen.Denken Sie auch daran , dass Sie laufen müssen werde
git fetch --prune
zuerst , sonstgit branch -r
wird die Fernbedienung immer noch Zweige sehen.quelle
git fetch -p
ist das nicht immer genug?sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required
Irgendwelche Ideen?alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
git branch -D
am Ende des Befehls hat für uns besser funktioniert, da wir dazu neigen, Commits beim Zusammenführen zu quetschen, was zuThe branch x is not fully merged
Fehlern beim Ausführen mit führt-d
.Wenn Sie alle lokalen Zweige löschen möchten, die bereits mit dem Master zusammengeführt wurden, können Sie den folgenden Befehl verwenden:
Weitere Infos .
quelle
xargs -r git branch -d
Option, damit nichts ausgeführt wird, wenn keine zu löschenden Zweige vorhanden sind. Beachten Sie, dass die-r
Flagge möglicherweise nicht überall verfügbar istgit branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
git branch --merged master
Zweige auf, die zu master zusammengeführt werden, dann schließt der mittlere grep-Teil den Master selbst aus (wir wollen den Master nicht löschen!), Und der letzte xargs-Teil wirdgit branch -d
auf jedem von ausgeführt (Zweig löschen) die Ergebnisse. Oder lesen Sie einfach den Link Weitere Informationen in der Antwort;)git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d
. Die Ausgabe von git v2.10.1 zeigt "* master" an, wenn der Master ausgecheckt ist. Ich werde den Meister sowohl mit als auch ohne Sternchen los.Inmitten der Informationen von
git help fetch
gibt es diesen kleinen Punkt:Also, vielleicht
git fetch -p
ist das , wonach Sie suchen?EDIT: Ok, für diejenigen, die diese Antwort 3 Jahre später noch diskutieren, hier ein paar weitere Informationen darüber, warum ich diese Antwort präsentiert habe ...
Erstens sagt das OP, dass sie "auch die lokalen Zweige entfernen möchten, die aus diesen entfernten Zweigen [die sich nicht mehr auf der entfernten befinden] erstellt wurden". Dies ist in nicht eindeutig möglich
git
. Hier ist ein Beispiel.Angenommen, ich habe ein Repo auf einem zentralen Server und es hat zwei Zweige, genannt
A
undB
. Wenn ich dieses Repo auf mein lokales System klone, werden auf meinem Klon lokale Refs (noch keine tatsächlichen Zweige) aufgerufenorigin/A
undorigin/B
. Nehmen wir jetzt an, ich mache Folgendes:Die relevanten Fakten hier sind, dass ich mich aus irgendeinem Grund dafür entschieden habe, einen Zweig in meinem lokalen Repo zu erstellen, der einen anderen Namen als seinen Ursprung hat, und ich habe auch einen lokalen Zweig, der (noch) nicht im Ursprungs-Repo existiert.
Lassen Sie uns jetzt sagen , dass ich beide entfernen das
A
undB
Zweige auf dem Remote - Repo und aktualisieren meine lokalen Repo (git fetch
in irgendeiner Form), die meine lokalen Refs verursachtorigin/A
undorigin/B
verschwinden. Nun, meine lokale Repo hat drei Zweige noch,A
,Z
, undC
. Keiner von diesen hat einen entsprechenden Zweig auf dem Remote-Repo. Zwei von ihnen wurden "aus ... entfernten Zweigen erstellt", aber selbst wenn ich weiß, dass es früher einen Zweig gab, derB
nach dem Ursprung aufgerufen wurde , kann ich nicht wissen, dassZ
dieser Zweig erstellt wurdeB
, weil es dabei wahrscheinlich aus gutem Grund umbenannt wurde. Ohne externe Metadaten zur Erfassung von Zweigursprüngen oder einen Menschen, der die Historie kennt, ist es unmöglich zu sagen, auf welchen der drei Zweige das OP gegebenenfalls abzielt. Ohne einige externe Informationen,git
die nicht automatisch für Sie gepflegt werden,git fetch -p
ist sie so nah wie möglich, und jede automatische Methode, um buchstäblich zu versuchen, was das OP verlangt, läuft Gefahr, entweder zu viele Zweige zu löschen oder einige zu verpassen, die das OP sonst hätte gelöscht werden wollen.Es gibt auch andere Szenarien, z. B. wenn ich drei separate Zweige erstelle
origin/A
, um drei verschiedene Ansätze für etwas zu testen, und dannorigin/A
verschwindet. Jetzt habe ich drei Zweige, die offensichtlich nicht alle namentlich übereinstimmen können, aber aus denen sie erstelltorigin/A
wurden. Eine wörtliche Interpretation der OP-Frage würde daher das Entfernen aller drei Zweige erfordern. Dies ist jedoch möglicherweise nicht wünschenswert, wenn Sie sogar einen zuverlässigen Weg finden könnten, um sie anzupassen ...quelle
Dadurch werden die lokalen Zweige gelöscht, für die die Fernverfolgungszweige entfernt wurden. (Stellen Sie sicher, dass Sie auf dem
master
Ast sind!)Einzelheiten:
git branch -vv
Zeigt "weg" für lokale Zweige an, für die die Fernbedienung beschnitten wurde.-d
prüft, ob es zusammengeführt wurde (-D
löscht es trotzdem)quelle
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
git branch -d
die Zweige mit denen verglichen werdenHEAD
.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Man kann Git so konfigurieren, dass beim Abrufen automatisch Verweise auf gelöschte Remote-Zweige entfernt werden:
Beim Aufrufen
git fetch
odergit pull
danach werden Verweise auf gelöschte Remote-Zweige automatisch entfernt.quelle
git branch -r
.Es gibt ein ordentliches NPM-Paket, das dies für Sie erledigt (und es sollte plattformübergreifend funktionieren).
Installieren Sie es mit:
npm install -g git-removed-branches
Und dann
git removed-branches
zeigen wir Ihnen alle abgestandenen lokalen Filialen, undgit removed-branches --prune
sie tatsächlich löschen.Mehr Infos hier.
quelle
npx git-removed-branches
funktioniert wie ein Traum.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().Split(" ")[0]}
Holen Sie sich den Filialnamen% {git branch -d $_}
löscht den Zweigquelle
git remote prune origin
kann auch select-string nicht mit der neuesten Version von git übereinstimmen. Erwägen Sie die Verwendung vonConvertFrom-String -TemplateContent
git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Es werden die lokalen Zweige aufgelistet, deren Fernverfolgungszweig von der Fernbedienung gelöscht wird
Wenn Sie diese lokalen Zweige von lokalen Zweigen entfernen möchten, die nicht verfolgt werden
quelle
Wie @tzacks bemerkt ... gibt es ein npm-Paket, das dafür praktisch ist. Mach einfach:
(Ich hätte kommentiert, aber nicht genug Ruf)
quelle
Wenn Sie Windows und Powershell verwenden, können Sie Folgendes verwenden, um alle lokalen Zweige zu löschen, die mit dem aktuell ausgecheckten Zweig zusammengeführt wurden:
Erläuterung
git
Ausgabe für jeden verbleibenden ZweignamenEs lohnt sich zu rennen
git branch --merged
sich, zuerst alleine nur um sicherzustellen, dass nur das entfernt wird, was Sie erwarten.(Portiert / automatisiert von http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ .)
quelle
Noch kürzer und sicherer Einzeiler:
Stellen Sie sicher, dass Sie zu einem Zweig auschecken, der noch nicht zusammengeführt wurde, bevor Sie ihn ausführen. Weil Sie den aktuell eingecheckten Zweig nicht löschen können.
quelle
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
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 erstellen, und ihn dann als Alias in meinem hinzugefügt~/.gitconfig
.Hier ist ein
git config --global ...
Befehl zum einfachen Hinzufügengit prune-branches
:HINWEIS: Verwendung der
-D
Flagge zugit branch
kann sehr gefährlich sein. Also benutze ich im obigen Befehl config die-d
Option togit branch
anstatt-D
; Ich benutze-D
in meiner aktuellen Konfiguration. Ich benutze,-D
weil ich nicht möchte, dass Git sich über nicht zusammengeführte Zweige beschwert, ich möchte nur, dass sie verschwinden. Möglicherweise möchten Sie diese Funktionalität auch. Wenn ja, verwenden Sie einfach-D
statt-d
am Ende dieses Konfigurationsbefehls.quelle
So entfernen Sie entfernte Zweige:
So entfernen Sie bereits zusammengeführte lokale Zweige:
quelle
Es scheint keinen sicheren Einzeiler zu geben, zu viele Randfälle (wie ein Zweig, dessen Name "Master" enthält usw.). Am sichersten sind diese Schritte:
git branch -vv | grep 'gone]' > stale_branches.txt
awk '{print $1}' stale_branches.txt | xargs git branch -d
quelle
Basierend auf den obigen Antworten verwende ich diesen kürzeren Einzeiler:
Wenn Sie bereits beschnitten sind und lokale baumelnde Zweige haben, werden diese dadurch aufgeräumt:
quelle
/
in ihnenIch bin mir nicht sicher, wie ich alles auf einmal machen soll, aber git
git branch -d <branchname>
löscht einen lokalen Zweig NUR, wenn er vollständig zusammengeführt ist. Beachten Sie den Kleinbuchstaben d.git branch -D <branchname>
(Beachten Sie das Großbuchstaben D) Löscht eine lokale Niederlassung unabhängig von ihrem zusammengeführten Status.quelle
Sie können diesen Befehl verwenden:
Git Clean: Löschen Sie bereits zusammengeführte Zweige, einschließlich der Aufschlüsselung des Befehls
quelle
Basierend auf den obigen Antworten kam ich mit dieser einzeiligen Lösung:
quelle
Unter Verwendung einer Variante der Antwort von @ wisbucky habe ich meiner
~/.gitconfig
Datei Folgendes als Alias hinzugefügt :Mit dieser Funktion
git pruneitgood
werden sowohl lokale als auch Remote-Zweige, die nach dem Zusammenführen nicht mehr benötigt werden , auf einfache Weise bereinigt.quelle
Die Powershell-Version von
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}
Dadurch werden alle lokalen Zweige entfernt, die mit dem Master zusammengeführt wurden, während Sie sich im Master-Zweig befinden .
git checkout master
wechseln.quelle
Schleis 'Variante funktioniert bei mir nicht (Ubuntu 12.04), also lassen Sie mich meine (klaren und glänzenden :) Varianten vorschlagen:
Variante 1 (ich würde diese Option bevorzugen):
Variante 2:
ein. Probelauf:
b. Zweige entfernen:
quelle
Es folgt eine Anpassung der Antwort von @ wisbucky für Windows-Benutzer:
for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d
Ich benutze posh-git und leider mag PS das Nackte nicht
for
, deshalb habe ich ein einfaches altes Befehlsskript namens PruneOrphanBranches.cmd erstellt:Rufen Sie es ohne Parameter auf, um eine Liste anzuzeigen, und rufen Sie es dann mit "-d" auf, um das eigentliche Löschen durchzuführen, oder "-D" für alle Zweige, die nicht vollständig zusammengeführt wurden, die Sie aber trotzdem löschen möchten.
quelle
:
oder:
(mit einem Leerzeichen) dazu geführt,findstr
dass es jedes Mal zu allem passt - ich habe fast den Master gelöscht. Die Verwendung eines regulären Ausdrucks funktionierte jedoch einwandfrei:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Versuchen Sie dies in git bash, um Verweise auf gelöschte Zweige abzurufen und zu bereinigen, und bereinigen Sie dann die lokalen Zweige, die die entfernten Zweige verfolgten:
Denken Sie daran, zuerst einen Zweig auszuchecken, der nicht gelöscht wird, damit das Löschen des Zweigs nicht blockiert wird.
quelle
Ich habe die akzeptierte Antwort in ein robustes Skript umgewandelt. Sie finden es in meinem Git-Extensions-Repository .
quelle
Ich erreichte diese Seite und suchte nach der Antwort für "Wie lösche ich lokal ausgecheckte Zweige, die keinen vorgelagerten Zweig mehr haben?"
Es war mir auch egal, ob der lokale Zweig noch zusammengeführt wurde oder nicht, da das
git branch -d
Weiterleiten in einfach warnt, anstatt nicht zusammengeführte lokale Zweige zu löschen.quelle
In Powershell :
quelle
Hier ist meine Lösung:
-p dient zum Entfernen von Remote-Tracking-Referenzen, die auf der Remote nicht mehr vorhanden sind. Im ersten Schritt werden also Verweise auf entfernte Zweige entfernt.
-vv dient zum Anzeigen von sha1 und zum Festschreiben der Betreffzeile für jeden Kopf sowie der Beziehung zum vorgelagerten Zweig (falls vorhanden). Im zweiten Schritt werden alle lokalen Zweige abgerufen, und der Befehl grep filtert gelöschte Zweige heraus.
quelle
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Löschen Sie alle Zweige, die mit dem Master nicht auf dem neuesten Stand sind
quelle
Ich bin mir ziemlich sicher, dass
git remote prune origin
du das willst.Sie können es ausführen, um
git remote prune origin --dry-run
zu sehen, was es tun würde , ohne Änderungen vorzunehmen.quelle
Verwenden Sie die GUI? Manuelle Vorgehensweise, aber schnell und einfach.
Wählen Sie "Zweig -> Löschen". Sie können mehrere Zweige mit Strg-Klick (Fenster) auswählen und alle entfernen.
quelle