1366 Stimmen

Wie kann man lokale Tracking-Branches beschneiden, die nicht mehr auf dem Remote existieren?

Mit git remote prune origin kann ich die lokalen Branches entfernen, die nicht mehr auf dem Remote-Server 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

One-Liner, 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 weitere Details.

0 Stimmen

Ich denke normalerweise, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da Sie sich sonst offenlegen, etwas zu löschen, das Sie nicht löschen wollten. Daher 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 Datensätze zurück, bei denen sie von entfernt wurden.

% { $_.toString().Split(" ")[0]} gibt den Zweig-Namen zurück

% {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 der 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 Verweise auf gelöschte Remote-Zweige automatisch entfernt werden, beim Abrufen:

git config --global fetch.prune true

Beim Aufruf von git fetch oder git pull danach werden Verweise auf gelöschte Remote-Zweige automatisch entfernt.

19 Stimmen

Dies entfernt keine lokalen Zweige, sondern nur Verweise auf sie, oder?

0 Stimmen

@ClintEastwood Es löscht nur Verweise auf remote Zweige. Sie können Verweise auf Remote-Zweige mit git branch -r auflisten.

61voto

johnshew Punkte 589

Wie @tzacks anmerkt... es gibt ein npm-Paket, das dafür praktisch ist. Einfach tun:

npx git-removed-branches --prune

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

3 Stimmen

Wunderschön. Keinerlei Probleme. Schön, dass dies eine vollständige Antwort war!

4 Stimmen

Dies sollte oben sein. Funktioniert auch unter Windows.

2 Stimmen

Nuller Ärger! 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, die nicht verfolgt werden, von lokal auflösen möchten

$ git remote prune origin

27 Stimmen

Das beantwortet die Frage nicht, das wusste der Fragesteller bereits.

6 Stimmen

Ich stimme auch zu, aber wenn Sie nach "Wie man lokale Tracking-Branches 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 Up-Votes:)

0 Stimmen

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

24voto

Gnat Punkte 2751

Wenn Sie Windows und Powershell verwenden, können Sie das Folgende verwenden, um alle lokalen Branches zu löschen, die in den aktuell ausgecheckten Branch gemergt wurden:

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

Erklärung

  • Listet den aktuellen Branch und die Branches auf, die in ihn gemergt wurden
  • Filtert den aktuellen Branch heraus
  • Bereinigt eventuelle führende oder abschließende Leerzeichen aus der git-Ausgabe für jeden verbleibenden Branch-Namen
  • Löscht die gemergten lokalen Branches

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

(Übersetzt/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 zu denen, die nur als gelöscht markiert sind. Dies könnte unerwünscht sein, wenn Sie Umgebungs- oder Release-Branches haben, die zusammengeführt wurden, die wir jedoch 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