Mitten in den Informationen, die von git help fetch
präsentiert werden, gibt es dieses kleine Element:
-p, --prune
Entferne nach dem Abrufen alle Remote-Tracking-Zweige, die nicht mehr auf dem Remote-Host vorhanden sind.
Vielleicht ist also git fetch -p
das, wonach du suchst?
BEARBEITEN: Ok, für diejenigen, die diese Antwort immer noch 3 Jahre später diskutieren, hier sind noch ein paar zusätzliche Informationen, warum ich diese Antwort vorgestellt habe...
Zunächst einmal sagt der Fragesteller, dass er auch "die lokalen Zweige entfernen möchte, die von den Remote-Zweigen erstellt wurden [die nicht mehr auf dem Remote-Host sind]". Dies ist in git
nicht eindeutig möglich. Hier ist ein Beispiel.
Angenommen, ich habe ein Repository auf einem zentralen Server, und es hat zwei Zweige namens A
und B
. Wenn ich dieses Repository auf mein lokales System klonen, werden meine Kopien lokale Verweise (noch keine tatsächlichen Zweige) namens origin/A
und origin/B
haben. Nehmen wir nun an, ich mache folgendes:
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C
Die relevanten Fakten hier sind, dass ich aus irgendeinem Grund beschlossen habe, einen Zweig in meinem lokalen Repository mit einem anderen Namen als seinem Ursprung zu erstellen, und ich habe auch einen lokalen Zweig, der noch nicht auf dem Ursprung-Repository existiert.
Nehmen wir nun an, ich entferne die Zweige A
und B
im Remote-Repository und aktualisiere mein lokales Repository (git fetch
in irgendeiner Form), was dazu führt, dass meine lokalen Verweise origin/A
und origin/B
verschwinden. Jetzt hat mein lokales Repository immer noch drei Zweige, A
, Z
und C
. Keiner von ihnen hat einen entsprechenden Zweig im Remote-Repository. Zwei von ihnen wurden "aus ... Remote-Zweigen erstellt", aber selbst wenn ich weiß, dass es einen Zweig namens B
im Ursprung gab, habe ich keine Möglichkeit zu wissen, dass Z
von B
erstellt wurde, weil es im Prozess umbenannt wurde, wahrscheinlich aus gutem Grund. Ohne einen externen Prozess, der Metadaten zur Ursprungs-Zweiginformation aufzeichnet, oder einen Menschen, der die Historie kennt, ist es also unmöglich zu sagen, auf welche der drei Zweige, wenn überhaupt, der Fragesteller abzielt. Ohne externe Informationen, die git
nicht automatisch für dich pflegt, ist git fetch -p
so nah dran wie möglich, und jede automatische Methode, die wörtlich das zu versuchen, was der Fragesteller gefragt hat, läuft Gefahr, entweder zu viele Zweige zu löschen oder einige zu übersehen, die der Fragesteller sonst löschen möchte.
Es gibt auch andere Szenarien, wie wenn ich drei separate Zweige von origin/A
erstelle, um drei verschiedene Ansätze für etwas zu testen, und dann verschwindet origin/A
. Jetzt habe ich drei Zweige, die offensichtlich nicht alle namensmäßig übereinstimmen können, aber sie wurden von origin/A
erstellt, und daher würde eine wörtliche Interpretation der Frage des Fragestellers erfordern, alle drei zu entfernen. Das mag jedoch nicht wünschenswert sein, selbst wenn man einen zuverlässigen Weg finden könnte, um sie zuzuordnen...
12 Stimmen
Möglicher Duplikat von Lokale Branches entfernen, die nicht mehr auf dem Remote-Server sind
8 Stimmen
Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf deiner Tastatur geschlafen:
npx git-removed-branches
(Trockenlauf) odernpx git-removed-branches --prune
(für echte Durchführung). Sie müssen bereits node.js installiert haben. Siehe Antworten unten für Details.0 Stimmen
Normalerweise denke ich, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da man sich sonst öffnet, etwas zu löschen, was man nicht löschen wollte. Also würde ich beim git branch -d localBranchName und git push origin --delete remoteBranchName bleiben.
3 Stimmen
Für IntelliJ-Benutzer tut das folgende Plugin genau das, was Sie brauchen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner