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.

1voto

Guillermo Gutiérrez Punkte 16384

Versuchen Sie dies in Git Bash, um Referenzen zu gelöschten Branches abzurufen und zu bereinigen und dann die lokalen Branches zu bereinigen, 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, um das Löschen des Branches nicht zu blockieren.

0voto

Meredith Punkte 3204

Ich habe diese Seite auf der Suche nach der Antwort auf "Wie lösche ich lokal ausgecheckte Branches, die keinen Upstream-Branch mehr haben" erreicht

Es war mir auch egal, ob der lokale Branch bereits gemerged wurde, da das Pipen in git branch -d einfach eine Warnung ausgibt, anstatt nicht gemergte 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
## dies findet alle Remote-Branchnamen ohne den Teil "remote/origin/"
#
# <(git branch -a | grep -v origin)
## dies findet alle lokalen Branchnamen und leitet es in den vorherigen Befehl weiter
#
# egrep -v -f /dev/fd/0 STUFF
## dies führt eine seltsame Magie aus, die ich als "die Differenzmenge von dem nehmen, was eingepiped wurde"
#
#
# Gesamtübersetzung: (ZU BERÜCKSICHTIGENDE SACHEN) | egrep Magie <(VON DER BERÜCKSICHTIGUNG ZU ENTFERNENDE SACHEN) | coole Dinge mit dem resultierenden Zeug machen

0voto

Neben Schleis Antwort (die perfekt funktioniert), kann dies auch in Visual Studio integriert werden, sodass das Beschneiden lokaler Branches, wenn ein Git-Repository in VS geöffnet ist, wirklich einfach ist.

Sie können die External Tools-Funktionalität verwenden, um sh.exe (Git Bash) mit einem bestimmten Verzeichnis und Befehl aufzurufen. Dies befindet sich im Menüpunkt Tools > External 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, innerhalb eines Git-Repo-Verzeichnisses liegt.

Abschließende Anmerkung - dies kann über die Benutzeroberfläche zur Tastenzuordnung von Visual Studio in Einstellungen > Allgemein > Tastatur und der Suche nach Tools.ExternalCommand[n] gebunden werden, wobei n die Position in der Liste der externen Befehle ist, an der dieses externe Tool positioniert ist (sie können in dem Dialogfeld Tools > External Tools neu angeordnet werden). Siehe untenstehenden Screenshot.

Keybinding eines External Tools Befehls

0voto

cyan-kinesin Punkte 351

Überprüfen Sie die Ziele

für Ziel in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do echo $target; done

Führen Sie es mit for & Subbefehlen aus

für Ziel in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); dann git branch -D $target; done

Sie können andere Funktionen zu Zweigen hinzufügen, wenn etwas funktioniert.

0voto

PaulH Punkte 2742

Ich habe hier keine hilfreichen Antworten gefunden, als die Fernbedienung selbst nicht mehr existierte. Ich sah immer wieder Zweige von Fernbedienungen, die nicht mehr existierten, fand aber keinen git Befehl, 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 bei git branch -r zu 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