1366 Stimmen

Wie werden lokale Tracking-Branches beschnitten, die nicht mehr auf dem Remote existieren?

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

Aber ich möchte auch die lokalen Branches entfernen, die von diesen Remote-Branches erstellt wurden (eine Überprüfung, ob sie ungemerged sind, wäre schön).

Wie kann ich das tun?

12 Stimmen

8 Stimmen

Eine Zeile, plattformübergreifend, sieht nicht aus, als ob die Katze auf deiner Tastatur geschlafen hätte: npx git-removed-branches (trocken laufen) 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 normalerweise, dass solche Dinge bewusst und nicht automatisch gemacht werden sollten, da man sich sonst versehentlich etwas löschen könnte, das man nicht löschen wollte. Also 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 erhält eine ausführliche Ausgabe aller Zweige (git Referenz)

Select-String -Pattern ": gone]" erhält nur die Einträge, bei denen sie aus dem Remote 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. Betrachten Sie die Verwendung von ConvertFrom-String -TemplateContent

4 Stimmen

Sieht so aus, als würde die neueste Version von Git einige Leerzeichen hinzufügen, sodass die Aufteilung nicht funktioniert, um den Branch-Namen zu erhalten. Führen Sie ".toString().Trim().Split(" ") aus und es wird funktionieren.

0 Stimmen

Hier ist meiner: 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

entfernt das keine lokalen Branches, sondern nur Verweise darauf, oder?

0 Stimmen

@ClintEastwood Es löscht nur Verweise auf remote Zweige. Sie können Verweise auf entfernte Zweige auflisten, indem Sie git branch -r verwenden.

61voto

johnshew Punkte 589

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

npx git-removed-branches --prune

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

3 Stimmen

Herrlich. Kein Ärger überhaupt. Freue mich, dass dies eine vollständige Antwort war!

4 Stimmen

Dies sollte oben sein. Funktioniert auch in Windows.

2 Stimmen

Nuller Aufwand! 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-Repository gelöscht wurde

$ git remote prune origin --dry-run

Wenn Sie diese lokalen Zweige löschen möchten, die nicht verfolgt werden

$ 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 Sie lokale Tracking-Zweige beschneiden, die nicht mehr auf dem Remote existieren" suchen, ist dies der oberste Link, und diese Antwort entspricht dem 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 bleiben nach Ausführen dessen noch erhalten

24voto

Gnat Punkte 2751

Wenn Sie Windows und Powershell verwenden, können Sie das folgende verwenden, um alle lokalen Zweige zu löschen, die in den aktuellen Zweig verschmolzen wurden:

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

Erklärung

  • Listet den aktuellen Zweig und die Zweige auf, die in ihn eingefügt wurden
  • Filtert den aktuellen Zweig heraus
  • Bereinigt alle führenden oder nachfolgenden Leerzeichen aus der git Ausgabe für jeden verbleibenden Zweigname
  • Löscht die verschmolzenen lokalen Zweige

Es lohnt sich, zuerst git branch --merged alleine auszuführen, 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/.)

0 Stimmen

Dies löscht alle zusammengeführten Branches gegenüber nur denen, die als gelöscht markiert sind remote. Dies könnte unerwünscht sein, wenn Sie Umgebungs- oder Release-Branches haben, die zusammengeführt wurden, aber die wir behalten wollen (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