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 vorhanden sind.

Aber ich möchte auch lokale 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 machen?

12 Stimmen

8 Stimmen

Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf Ihrer 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 normalerweise, dass diese Dinge absichtlich und nicht automatisch gemacht werden sollten, da Sie sich ansonsten selbst dem Risiko aussetzen, etwas zu löschen, das Sie nicht löschen wollten. Also 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 bereinigen würde, die einem Remote-Branch auf origin folgen, wenn der Remote-Branch gelöscht wurde (gone). Ich wollte keine lokalen Branches löschen, die nie eingerichtet wurden, um einem Remote-Branch zu folgen (z. B. meine lokalen Entwicklungs-Branches). Außerdem wollte ich einen einfachen Einzeiler, der einfach nur git oder andere einfache CLI-Tools verwendet, anstatt benutzerdefinierte Skripte zu schreiben. Am Ende habe ich ein bisschen grep und awk verwendet, um diesen einfachen Befehl zu erstellen, dann habe ich ihn 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 Befehl git config --global ..., 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 verwende ich in dem Konfigurationsbefehl oben die -d-Option für git branch anstelle von -D; Ich verwende -D in meiner tatsächlichen Konfiguration. Ich verwende -D, weil ich nicht möchte, dass Git sich über nicht zusammengeführte Branches beschwert, sondern sie einfach verschwinden sollen. Möglicherweise möchten Sie diese Funktionalität auch. In diesem Fall verwenden Sie einfach am Ende dieses Konfigurationsbefehls -D anstelle von -d.

20voto

FelikZ Punkte 2891

Auch kürzerer und sicherer Einzeiler:

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

Stellen Sie sicher, dass Sie zu einem Branch wechseln, der noch nicht zusammengeführt wurde, bevor Sie ihn ausführen. Denn Sie können keinen Branch löschen, in dem Sie sich derzeit befinden.

3 Stimmen

Wird dies auch Ihren 'Master' entfernen?

2 Stimmen

Wenn Sie derzeit im Master eingeloggt sind, 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 auf dem Remote nicht mehr existieren. Der erste Schritt entfernt also Verweise auf Remote-Branches.

  • -vv zeigt sha1 und Commit-Betreffzeile für jeden Kopf, zusammen mit der Beziehung zum Upstream-Branch (falls vorhanden) an. Im zweiten Schritt werden alle lokalen Branches abgerufen und das Grep-Kommando filtert die 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 ändern, da mir sonst Ihre zweite Zeile bei jedem Branch dieses Ergebnis geliefert hätte: Fehler: Der Branch 'Ihr-Branch' ist nicht vollständig gemerged. Wenn Sie sicher sind, dass Sie ihn löschen möchten, führen Sie 'git branch -D Ihr-Branch' aus.

12voto

Oliver Punkte 24156

Es scheint keinen sicheren Einzeiler zu geben, zu viele Randfä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 den Inhalt keiner 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 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