Dieser Befehl und das unten stehende Skript funktionieren unter Linux und Windows mit Git Bash (MinGW).
Es ist am besten, die internen Befehle von Git zu verwenden, damit Kommentare oder Namen nicht versehentlich übereinstimmen und einen Zweig löschen, den Sie nicht löschen möchten. Es gibt viele interne "Atoms", die mit der Formatoption von git for-each-ref
verwendet werden können, um die gewünschten Informationen auszugeben. Auf diese Weise müssen wir uns nicht darauf verlassen, ein Piping zu awk
oder grep
durchzuführen, um einen regulären Ausdruck auf Ausgaben zu überprüfen, der möglicherweise unnötige Informationen enthält.
Der folgende Befehl verwendet nur die internen Befehle von git for-each-ref
, um nur verwaiste lokale Branches aufzulisten. Sobald Sie diese haben, können Sie zu git branch -D
überleiten. Vergessen Sie auch nicht, Ihre Remote-Referenzen zuerst zu bereinigen und abzurufen, da es sonst keine Übereinstimmungen finden wird:
git fetch -p
git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**' | xargs -r git branch -D
Hier ist eine Aufschlüsselung:
git fetch -p
– entfernte Referenzen bereinigen und neue von Remote abrufen
git for-each-ref --format
– listet alle Referenzen unter Verwendung eines bestimmten Ausgabeformats auf.
%(if:equals=[gone])%(upstream:track)
– gibt nur aus, wenn der Upstream-Tracking-Zweig "[gone]" ist.
%(then)%(refname:short)%(end)
– gibt den Branch-Namen aus (wenn das Tracking verschwunden ist).
refs/heads/**
– beschränkt sich auf Head-Referenzen (für Effizienz).
| xargs -r git branch -D
– gibt die Ausgabe als Parameter für die Löschung weiter. Das -r
zeigt an, dass leere Eingaben ignoriert werden sollen.
An sich ist diese Lösung lang, lächerlich zu tippen und schwer zu merken. Zum Glück ist es einfach, benutzerdefinierte Befehle zu Git hinzuzufügen. Unten ist ein Skript, das denselben Befehl wie oben verwendet, aber es ermöglicht dem Benutzer, mit einer --dry-run
-Option zu sehen, welche Branches ausgewählt werden.
Ich habe meine Datei git-prune-local
genannt und sie in einem Ordner abgelegt, der in meinem PATH
enthalten war. Sie benötigt auch Ausführungsberechtigungen (chmod 755 git-prune-local
).
Git sucht automatisch nach ausführbaren Dateien wie git-[command]
. Damit müssen Sie nur git prune-local
eingeben, damit die richtigen Branches gelöscht werden.
git-prune-local
#!/bin/sh
if [ $# -gt 1 ] || ([ ! -z $1 ] && [ $1 != "--dry-run" ])
then
echo "Verwendung: git prune-local [--dry-run]"
exit
fi
git fetch -p --quiet
branchesToDelete=$(git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**')
while read -r branch
do
if [ ! -z $branch ]
then
if [ ! -z $1 ]
then
echo $branch
else
git branch -D $branch
fi
fi
done <<< "$branchesToDelete"
12 Stimmen
Möglicher Duplikat von Lokale Branches entfernen, die nicht mehr auf dem Remote-Server vorhanden sind
8 Stimmen
Einzeiler, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner Tastatur geschlafen:
npx git-removed-branches
(Trockenlauf) odernpx 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.
3 Stimmen
Für IntelliJ-Benutzer tut das folgende Plugin genau das, was Sie benötigen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner