1366 Stimmen

Wie kann man lokale Tracking-Zweige beschneiden, die nicht mehr auf dem Remote vorhanden sind?

Mit git remote prune origin kann ich die lokalen Branches entfernen, die nicht mehr auf dem Remote vorhanden sind.

Aber ich möchte auch die lokalen Branches entfernen, die von diesen Remote-Branches erstellt wurden (eine Überprüfung, ob sie nicht zusammengeführt wurden, wäre nett).

Wie kann ich das tun?

12 Stimmen

8 Stimmen

Einzeiler, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner Tastatur geschlafen: npx git-removed-branches (Trockenlauf) oder npx 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.

101voto

chris31389 Punkte 6910

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 zum Master-Zweig

git remote update origin --prune bereinigt entfernte Zweige

git branch -vv gibt eine ausführliche Ausgabe aller Zweige aus (git Referenz)

Select-String -Pattern ": gone]" gibt nur die Einträge zurück, die von entfernt wurden.

% { $_.toString().Split(" ")[0]} erhält den Zweig-Namen

% {git branch -d $_} löscht den Zweig

0 Stimmen

Schönes Beispiel. Verwenden Sie alternativ git remote prune origin, auch select-string scheint nicht mit der neuesten Version von git übereinzustimmen. Erwägen Sie die Verwendung von ConvertFrom-String -TemplateContent

4 Stimmen

Sieht so aus, als ob die neueste Version von git einige Leerzeichen hinzufügt, sodass das Split nicht funktioniert, um den Branch-Namen zu erhalten. Führen Sie .toString().Trim().Split(" ") aus und es wird.

0 Stimmen

Hier ist meine: git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

73voto

wedesoft Punkte 2463

Man kann Git so konfigurieren, dass automatisch Verweise auf gelöschte Remote-Zweige entfernt werden, wenn man abruft:

git config --global fetch.prune true

Wenn man danach git fetch oder git pull aufruft, werden Verweise auf gelöschte Remote-Zweige automatisch entfernt.

19 Stimmen

Dies entfernt lokal gespeicherte Branches nicht, sondern nur Referenzen auf sie, richtig?

0 Stimmen

@ClintEastwood Es löscht nur Verweise auf Remote-Branches. Du kannst Verweise auf Remote-Branches auflisten, indem du git branch -r verwendest.

61voto

johnshew Punkte 589

Wie @tzacks bemerkt ... es gibt ein npm-Paket, das dafür praktisch ist. Mach einfach:

npx git-removed-branches --prune

(Ich hätte kommentiert, aber nicht genug Reputation)

3 Stimmen

Wunderschön. Absolut keine Probleme. Freut mich, dass dies eine vollständige Antwort war!

4 Stimmen

Dies sollte oben stehen. Funktioniert auch unter Windows.

2 Stimmen

Kein Stress! Es wäre ganz oben, wenn es nicht npx benötigen würde

54voto

027 Punkte 1433

Es werden die lokalen Zweige aufgelistet, deren Remote-Tracking-Zweig vom Remote-Server gelöscht wurde

$ git remote prune origin --dry-run

Wenn Sie diese lokalen Zweige lokal auflösen möchten, die nicht verfolgt werden

$ git remote prune origin

27 Stimmen

Dies beantwortet die Frage nicht, das wusste der OP bereits.

6 Stimmen

Ich stimme auch zu, aber wenn Sie nach "Wie man lokale Tracking-Zweige beschneidet, die nicht mehr auf dem Remote existieren" suchen, ist dies der oberste Link und diese Antwort passt zum Titel (nicht, wenn man die vollständige Beschreibung in der Frage gelesen hat), das ist der Grund für die Up-Votes:)

0 Stimmen

Das entfernt die lokalen Branches nicht. Sie sind immer noch vorhanden, nachdem dies ausgeführt wurde.

24voto

Gnat Punkte 2751

Wenn Sie Windows und Powershell verwenden, können Sie folgendes verwenden, um alle lokalen Branches zu löschen, die in den aktuellen Branch zusammengeführt wurden:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

Erklärung

  • Listet den aktuellen Branch und die Branches auf, die darin zusammengeführt wurden
  • Filtert den aktuellen Branch heraus
  • Entfernt führende oder nachfolgende Leerzeichen aus der git-Ausgabe für jeden verbleibenden Branch-Namen
  • Löscht die zusammengeführten lokalen Branches

Es lohnt sich, zuerst git branch --merged alleine auszuführen, um sicherzustellen, dass nur das entfernt wird, was Sie erwarten.

(Übertragen/automatisiert von http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/.)

0 Stimmen

Dies löscht alle zusammengeführten Branches, im Vergleich nur zu denen, die als gelöscht gekennzeichnet sind. Dies könnte unerwünscht sein, wenn Sie Umgebungs- oder Release-Branches haben, die zusammengeführt wurden, aber die wir behalten möchten (wie uat prod usw.).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X