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.

20voto

Karl Wilbur Punkte 5214

Ich wollte etwas, das alle lokalen Branches löscht, die einem Remote-Branch auf origin folgen, wo der Remote-Branch gelöscht wurde (gone). Ich wollte nicht lokale Branches löschen, die nie eingerichtet wurden, um einem Remote-Branch zu folgen (d.h. meine lokalen Entwicklungs-Branches). Außerdem wollte ich eine einfache Einzeiler, der einfach git oder andere einfache CLI-Tools verwendet, anstatt benutzerdefinierte Skripte zu schreiben. Am Ende habe ich einen kleinen Teil von grep und awk benutzt, um diesen einfachen Befehl zu machen, und ihn dann als Alias in meiner ~/.gitconfig hinzugefügt.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

Hier ist ein git config --global ... Befehl, um dies einfach als git prune-branches hinzuzufügen:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

HINWEIS: Die Verwendung der -D Flagge für git branch kann sehr gefährlich sein. Daher benutze ich in dem obigen Konfigurationsbefehl die -d Option für git branch anstelle von -D; ich benutze -D in meiner tatsächlichen Konfiguration. Ich benutze -D, weil ich nicht möchte, dass Git sich über nicht zusammengeführte Branches beschwert, ich will einfach, dass sie verschwinden. Möglicherweise möchten Sie diese Funktionalität auch. Wenn ja, verwenden Sie einfach am Ende des Konfigurationsbefehls -D anstelle von -d.

20voto

FelikZ Punkte 2891

Auch kürzer und sicherer Einzeiler:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

Stellen Sie sicher, dass Sie auf einem Branch sind, der noch nicht gemerged wurde, bevor Sie es ausführen. Denn Sie können keinen Branch löschen, auf dem Sie gerade eingeloggt sind.

3 Stimmen

Wird dies auch Ihren 'master' entfernen?

2 Stimmen

Wenn Sie sich derzeit im Master-Branch befinden, dann nein, sonst ja

2 Stimmen

Um den Master zu überspringen, könnten Sie einfach an grep weiterleiten und das Inverse auswählen, wie folgt - git branch -d $(git branch --merged | cut -c 3- | grep -v master)

15voto

S'chn T'gai Spock Punkte 1007

Hier ist meine Lösung:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p dient zum Entfernen von Remote-Tracking-Verweisen, die nicht mehr auf dem Remote-Server existieren. Der erste Schritt entfernt also Verweise auf Remote-Branches.

  • -vv zeigt den SHA1 und die Betreffzeile für jeden Branch an, zusammen mit der Beziehung zum Upstream-Branch (falls vorhanden). Der zweite Schritt ruft alle lokalen Branches ab und das Grep-Kommando filtert Branches heraus, die gelöscht wurden.

0 Stimmen

Noch kleiner (wie in einem anderen Kommentar beschrieben) git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

0 Stimmen

Ich musste das letzte -d zu einem -D machen, da mir sonst in jeder Zweigstelle deine zweite Zeile folgende Ausgabe liefern würde: Fehler: Der Zweig 'dein-Zweig' ist nicht vollständig zusammengeführt. Wenn du sicher bist, dass du ihn löschen möchtest, führe 'git branch -D dein-Zweig' aus.

12voto

Oliver Punkte 24156

Es scheint keine sichere Einzeilerlösung zu geben, zu viele Ausnahmefälle (wie ein Zweig, der "master" als Teil seines Namens hat, usw.). Am sichersten sind diese Schritte:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. Öffnen Sie die Datei und entfernen Sie die Zeilen für die Zweige, die Sie behalten möchten (wie den Master-Zweig!); Sie müssen nicht den Inhalt einer Zeile bearbeiten
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

9voto

Aniket Punkte 251

Um entfernte Branches zu entfernen:

$git remote prune origin

Um lokale Branches zu entfernen, die bereits gemerged wurden:

$git branch -D $(git branch --merged)

0 Stimmen

Funktioniert für mich. Danke.

9 Stimmen

(git branch --merged) gibt auch 'master' für mich zurück. Und andere Branches, die nicht auf dem Remote-Server gelöscht wurden.

46 Stimmen

Das hat meinen Master-Zweig gelöscht.

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