1366 Stimmen

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

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

Aber ich möchte auch die lokalen Zweige entfernen, die von diesen Remote-Zweigen erstellt wurden (eine Überprüfung, ob sie nicht zusammengeführt wurden, wäre schön).

Wie kann ich das machen?

12 Stimmen

8 Stimmen

Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf deiner Tastatur geschlafen: npx git-removed-branches (Trockenlauf) oder npx git-removed-branches --prune (für echte Durchführung). Sie müssen bereits node.js installiert haben. Siehe Antworten unten für Details.

0 Stimmen

Normalerweise denke ich, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da man sich sonst öffnet, etwas zu löschen, was man nicht löschen wollte. Also würde ich beim 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, damit das Löschen des Branches nicht blockiert wird.

0voto

Meredith Punkte 3204

Ich erreichte diese Seite auf der Suche nach der Antwort auf die Frage "wie lösche ich lokal überprüfte Branches, die keinen Upstream-Branch mehr haben"

Es war mir auch egal, ob der lokale Branch bereits gemerged wurde oder nicht, da die Ausgabe von 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-Branch-Namen ohne den Teil "remote/origin/"
#
# <(git branch -a | grep -v origin)
## dies findet alle lokalen Branch-Namen und leitet es in den vorherigen Befehl weiter
#
# egrep -v -f /dev/fd/0 STUFF
## dies macht irgendeine komische Magie, die ich als "Nimm die Mengendifferenz von dem, was hereingepiped wurde" verstehe
#
#
# Gesamtübersetzung: (ZU BERÜCKSICHTIGENDE INFORMATIONEN) | egrep-Magie <(ZU ENTFERNENDE INFORMATIONEN) | 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 nutzen, um sh.exe (git bash) mit einem bestimmten Verzeichnis und Befehl aufzurufen. Dies befindet sich im Menü Tools > External Tools (in VS 2022 17.1.0). Die von mir verwendeten Parameter lauten wie folgt:

Befehl: {Pfad-zum-Git-Installationsverzeichnis}\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-Repository-Verzeichnis befindet.

Abschließende Anmerkung - dies kann über die Benutzeroberfläche zum Festlegen von Tastenkombinationen in den Visual Studio-Einstellungen unter Allgemein > Tastatur durch Suchen nach Tools.ExternalCommand[n] gebunden werden, wobei n die Position in der Tabelle der externen Befehle ist, an der dieses externe Tool positioniert ist (sie können in der Tools > External Tools-Dialogfeld neu angeordnet werden). Siehe untenstehenden Screenshot.

Tastenkombination für ein externes Tool-Befehl

0voto

cyan-kinesin Punkte 351

Überprüfen Sie die Ziele

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

Führen Sie mit for & Subbefehlen aus

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

Sie können andere Dinge über Branches erweitern.

0voto

PaulH Punkte 2742

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

Die Lösung für mich war, in das .git\refs\remotes Verzeichnis 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.

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