1366 Stimmen

Wie man lokale Tracking-Branches beschneidet, die auf dem Remote nicht mehr vorhanden sind?

Mit git remote prune origin kann ich die lokalen Branches entfernen, die nicht mehr auf dem Remote-Server vorhanden sind.

Aber ich möchte auch die lokalen Branches entfernen, die von diesen Remote-Branches erstellt wurden (eine Überprüfung, ob sie nicht gemergt 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 (Probelauf) oder npx git-removed-branches --prune (für echte). Sie müssen bereits node.js installiert haben. Siehe Antworten unten für Details.

0 Stimmen

Ich denke normalerweise, dass diese Dinge bewusst und nicht automatisch durchgeführt werden sollten, da man sich sonst selbst öffnet, etwas zu löschen, was man nicht löschen wollte. 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 entfernen und dann die lokalen Branches zu entfernen, 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 Branchs nicht blockiert wird.

0voto

Meredith Punkte 3204

Ich habe diese Seite erreicht, um die Antwort auf "wie lösche ich lokal ausgecheckte Branches, die keine Upstream-Branches mehr haben" zu finden

Es war mir auch egal, ob der lokale Branch bereits gemerged wurde, da die Weiterleitung an git branch -d einfach eine Warnung auslöst, 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 Branch-Namen ohne den Teil "remote/origin/"
#
# <(git branch -a | grep -v origin)
## dies findet alle lokalen Branch-Namen und leitet es an den vorherigen Befehl weiter
#
# egrep -v -f /dev/fd/0 STUFF
## das ist eine Art seltsame Magie, die ich als "die Differenzmenge von dem nehmen, was reingepiped wurde" verstehe
#
#
# Gesamtübersetzung: (ZU BERÜCKSICHTIGENDE SACHEN) | egrep Magie <(ZU ENTFERNENDE SACHEN) | coole Dinge mit dem resultierenden Zeug machen

0voto

Zusätzlich zur Antwort von Schlei (die perfekt funktioniert), kann dies 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, sich in einem Git-Repo-Verzeichnis befindet.

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

Tastenkombination für einen External Tools-Befehl

0voto

cyan-kinesin Punkte 351

Überprüfe Ziele

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

Führen Sie mit for & Subbefehlen aus

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

Sie können andere Dinge über Zweige erweitern.

0voto

PaulH Punkte 2742

Ich habe hier keine Antworten gefunden, die hilfreich waren, als die Fernbedienung selbst nicht mehr existierte. 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 Dateien direkt zu löschen, die nicht mehr relevant sind. Die Dateistruktur ist sehr einfach zu verstehen. Es ist die gleiche Struktur wie das, was 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