Mitten in den Informationen, die von git help fetch
präsentiert werden, gibt es dieses kleine Element:
-p, --prune
Entfernen Sie nach dem Abrufen alle Remote-Tracking-Branches, die auf dem Remote nicht mehr existieren.
Also ist vielleicht git fetch -p
das, wonach Sie suchen?
EDIT: Also, für diejenigen, die 3 Jahre nach der Tatsache immer noch über diese Antwort diskutieren, hier sind noch ein paar weitere Informationen, warum ich diese Antwort präsentiert habe...
Zunächst sagt der OP, dass er auch "die lokalen Branches entfernen möchte, die aus jenen Remote-Branches erstellt wurden, die nicht mehr auf dem Remote sind". Dies ist in git
nicht eindeutig möglich. Hier ist ein Beispiel.
Angenommen, ich habe ein Repo auf einem zentralen Server und es hat zwei Branches namens A
und B
. Wenn ich dieses Repo auf mein lokales System klonen, wird mein Klon lokale Verweise (noch keine tatsächlichen Branches) namens origin/A
und origin/B
haben. Angenommen, 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 Branch in meinem lokalen Repo mit einem anderen Namen als seinem Ursprung zu erstellen, und ich habe auch einen lokalen Branch, der noch nicht auf dem Ursprungs-Repo existiert.
Angenommen, ich entferne beide Branches A
und B
im Remote-Repo und aktualisiere mein lokales Repo (git fetch
in irgendeiner Form), was dazu führt, dass meine lokalen Verweise origin/A
und origin/B
verschwinden. Nun hat mein lokales Repo immer noch drei Branches, A
, Z
und C
. Keiner von ihnen hat einen entsprechenden Branch im Remote-Repo. Zwei von ihnen wurden "aus ... Remote-Branches erstellt", aber selbst wenn ich weiß, dass es einmal einen Branch namens B
im Ursprung gab, habe ich keine Möglichkeit zu wissen, dass Z
aus B
erstellt wurde, weil es im Prozess umbenannt wurde, wahrscheinlich aus gutem Grund. Also, ohne einen externen Prozess, der Metadaten zum Ursprungszweig aufzeichnet, oder einen Menschen, der die Historie kennt, ist es unmöglich zu sagen, auf welche der drei Branches, wenn überhaupt, der OP abzielt. Ohne einige externe Informationen, die git
nicht automatisch für Sie pflegt, ist git fetch -p
so ziemlich das, was Sie bekommen können, und jede automatische Methode, die wörtlich versucht, was der OP gefragt hat, birgt das Risiko, entweder zu viele Branches zu löschen oder einige zu verpassen, die der OP sonst löschen würde.
Es gibt auch andere Szenarien, z.B. wenn ich drei separate Branches von origin/A
erstelle, um drei verschiedene Ansätze für etwas zu testen und dann origin/A
verschwindet. Jetzt habe ich drei Branches, die offensichtlich nicht namensgleich sein können, aber sie wurden aus origin/A
erstellt, und daher würde eine wörtliche Interpretation der Frage des OPs erfordern, alle drei zu entfernen. Das mag jedoch nicht wünschenswert sein, wenn man überhaupt einen zuverlässigen Weg finden könnte, sie zuzuordnen...
12 Stimmen
Möglicher Duplikat von Lokale Branches entfernen, die nicht mehr auf dem Remote-Server vorhanden sind
8 Stimmen
Einzeiler, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner Tastatur geschlafen:
npx git-removed-branches
(Trockenlauf) odernpx git-removed-branches --prune
(für echt). Du musst bereits node.js installiert haben. Siehe Antworten unten für Details.0 Stimmen
Ich denke in der Regel, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da Sie sich sonst dem Risiko aussetzen, etwas zu löschen, das Sie nicht löschen wollten. Deshalb würde ich bei 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 benötigen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner