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.

20voto

Karl Wilbur Punkte 5214

Ich wollte etwas, das alle lokalen Branches löschen 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 (dh. 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, 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 verwende ich in dem oben genannten Konfigurationsbefehl die -d Option für git branch anstelle von -D; Ich verwende -D in meiner tatsächlichen Konfiguration. Ich verwende -D, weil ich nicht will, dass Git sich über nicht zusammengeführte Branches beschwert, ich will einfach, dass sie verschwinden. Möglicherweise möchten Sie auch diese Funktionalität. Wenn ja, verwenden Sie einfach -D anstelle von -d am Ende dieses Konfigurationsbefehls.

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 zu einem Zweig wechseln, der noch nicht zusammengeführt wurde, bevor Sie ihn ausführen. Denn Sie können keinen Zweig löschen, in dem Sie sich gerade befinden.

3 Stimmen

Wird dies auch Ihren 'master' entfernen?

2 Stimmen

Wenn Sie derzeit im Hauptzweig eingeloggt sind, dann nein, ansonsten ja.

2 Stimmen

Um den Master zu überspringen, könnten Sie einfach zu grep pipen 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 dazu, alle Referenzen zu entfernen, die auf dem Remote nicht mehr existieren. Der erste Schritt entfernt also Verweise auf Remote-Branches.

  • -vv zeigt den SHA1-Wert und die Überschrift für jeden Head an, zusammen mit der Beziehung zum Upstream-Branch (falls vorhanden). Der zweite Schritt holt alle lokalen Branches und der grep-Befehl 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 in ein -D ändern, sonst würde mir Ihre zweite Zeile bei jedem Branch folgende Ausgabe liefern: Fehler: Der Branch 'Ihr-Branch' ist nicht vollständig zusammengeführt. 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 (z. B. 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. Zeigen Sie die Datei an 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-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