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.

1voto

Guillermo Gutiérrez Punkte 16384

Versuchen Sie dies in Git Bash, um Referenzen zu gelöschten Branches abzurufen und zu entfernen, und löschen Sie dann die lokalen Branches, die die entfernten verfolgt haben:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

Vergessen Sie nicht, zuerst einen Branch auszuchecken, der nicht gelöscht wird, damit das Löschen des Branches nicht blockiert wird.

0voto

Meredith Punkte 3204

Ich habe diese Seite erreicht, um die Antwort auf die Frage "Wie lösche ich lokal überprüfte Branches, die keinen Upstream-Branch mehr haben, zu finden"

Es war mir auch egal, ob der lokale Branch bereits gemerged wurde, da das Piping in git branch -d einfach eine Warnung ausgibt, anstatt ungemergte lokale Branches zu löschen.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# Übersetzung
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## findet alle Remote-Branch-Namen ohne den Teil "remote/origin/"
#
# <(git branch -a | grep -v origin)
## findet alle lokalen Branch-Namen und leitet es in den vorherigen Befehl um
#
# egrep -v -f /dev/fd/0 STUFF
## das macht irgendwie eine seltsame Magie, die ich als "Nimm die Unterschiedsmenge von dem, was reingepiped wurde" verstehe
#
#
# Gesamtübersetzung: (ZU BEACHTENDES) | egrep Zauberei <(ZU ENTFERNENDES ZU BEACHTEN) | coole Dinge mit dem resultierenden Zeug machen

0voto

Zusätzlich zu Schleis Antwort (die perfekt funktioniert), kann dies in Visual Studio integriert werden, so dass das Beschneiden lokaler Branches, wenn ein Git-Repo in VS geöffnet ist, wirklich einfach ist.

Sie können die Externen Tools-Funktionalität verwenden, um sh.exe (git bash) mit einem bestimmten Verzeichnis und Befehl aufzurufen. Dies befindet sich im Menü Tools > Externe Tools (in VS 2022 17.1.0). Die von mir verwendeten Parameter lauten wie folgt:

Befehl: {Pfad-zum-Git-Installationsort}\bin\sh.exe

Argumente: --cd=$(SolutionDir) -c "git fetch -p ; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d"

Ausgangsverzeichnis: $(SolutionDir)

Screenshot von Git Prune Local Branches

Es ist erwähnenswert, dass dies nur funktioniert, wenn die Lösung, die Sie in VS geöffnet haben, sich in einem Git-Repo-Verzeichnis befindet.

Abschließende Anmerkung - dies kann über die Keybinding-Benutzeroberfläche von Visual Studio in Einstellungen > Allgemein > Tastatur gebunden werden und suchen nach Tools.ExternalCommand[n], wobei n die Position in der Tabelle für externe Befehle ist, an der Sie dieses externe Tool platziert haben (sie können im Dialogfeld Tools > Externe Tools neu angeordnet werden). Siehe Screenshot unten.

Keybinding eines externen Tools-Befehls

0voto

cyan-kinesin Punkte 351

Checke nach Zielen

for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do echo $target; done

Führe mit for & Subbefehlen aus

for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do git branch -D $target; done

Du kannst andere Dinge über Branches erweitern, wenn etwas funktioniert.

0voto

PaulH Punkte 2742

Ich habe die Antworten hier nicht hilfreich gefunden, als die Fernbedienung selbst nicht mehr existiert. Ich habe immer wieder Zweige von Fernbedienungen gesehen, die nicht mehr existierten, aber keinen Git-Befehl gefunden, um sie zu löschen.

Die Lösung für mich war, in das Verzeichnis .git\refs\remotes zu gehen und die nicht mehr relevanten Dateien direkt zu löschen. Die Dateistruktur ist sehr einfach zu verstehen. Es ist die gleiche Struktur wie die, die Sie mit git branch -r sehen.

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