Dieser Befehl und das Skript unten funktionieren in Linux und Windows mit Git Bash (MinGW).
Es ist am besten, git's interne Befehle zu verwenden, um zu vermeiden, dass Kommentare oder Namen aus Versehen übereinstimmen und einen Branch 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 auf das Piping zu awk
oder grep
verlassen, um einen regulären Ausdruck auf einem Ausgabewert zu überprüfen, der möglicherweise unnötige Informationen enthält.
Der folgende Befehl verwendet nur die internen Low-Level-Befehle von git for-each-ref
, um nur verwaiste lokale Branches aufzulisten. Sobald Sie diese haben, können Sie zu git branch -D
pipen. Vergessen Sie auch nicht, zuerst Ihre entfernten Referenzen zu löschen und zu fetchen, ansonsten werden keine Übereinstimmungen gefunden:
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 löschen und neue vom Remote-Repositorium abrufen
git for-each-ref --format
- listet alle Referenzen unter Verwendung eines bestimmten Ausgabeformats auf.
%(if:equals=[gone])%(upstream:track)
- nur ausgeben, wenn der Upstream-Tracking-Branch "[gone]" ist.
%(then)%(refname:short)%(end)
- gibt den Branch-Namen aus (wenn das Tracking weg ist).
refs/heads/**
- Begrenzung auf Head-Referenzen (für Effizienz).
| xargs -r git branch -D
- Piped die Ausgabe als Parameter für die Löschung. Das -r
zeigt an, leere Eingabe zu ignorieren.
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 den gleichen 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 in einem Ordner abgelegt, der in meinem PATH
enthalten war. Es benötigt auch Ausführungsberechtigungen (chmod 755 git-prune-local
).
Git sucht automatisch nach ausführbaren Dateien wie git-[Befehl]
. Damit müssen Sie nur git prune-local
eingeben, um die richtigen Branches zu löschen.
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 Remote vorhanden sind
8 Stimmen
Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf Ihrer 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 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.
3 Stimmen
Für IntelliJ-Benutzer tut das folgende Plugin genau das, was Sie brauchen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner