Dieser Befehl und das darunter stehende Skript funktionieren in Linux und Windows mit Git Bash (MinGW).
Es ist am besten, git's interne Befehle zu verwenden, damit Kommentare oder Namen nicht versehentlich übereinstimmen und einen Branch löschen, den du nicht löschen möchtest. 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, das Ergebnis auf einer Ausgabe zu überprüfen, die möglicherweise unnötige Informationen enthält.
Der untenstehende Befehl verwendet nur die internen Befehle von git for-each-ref
, um nur verwaiste lokale Branches aufzulisten. Sobald du diese hast, kannst du sie an git branch -D
weitergeben. Vergiss auch nicht, zuerst deine entfernten Verweise zu säubern und zu holen, sonst findet es keine Treffer:
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 Übersicht:
git fetch -p
- entfernt entfernte Verweise und holt neue vom Remote
git for-each-ref --format
- listet alle Verweise mit einem bestimmten Ausgabeformat auf.
%(if:equals=[gone])%(upstream:track)
- gibt nur aus, wenn der übergeordnete Tracking-Branch "[gone]" ist.
%(then)%(refname:short)%(end)
- gibt den Branch-Namen aus (wenn das Tracking verschwunden ist).
refs/heads/**
- beschränkt auf Head-Verweise (für Effizienz).
| xargs -r git branch -D
- leitet die Ausgabe als Parameter zur Löschung weiter. Das -r
zeigt an, leere Eingaben zu ignorieren.
An sich ist diese Lösung lang, lächerlich zu tippen und schwer zu merken. Glücklicherweise ist es einfach, benutzerdefinierte Befehle zu Git hinzuzufügen. Hier ist ein Skript, das denselben Befehl wie oben verwendet, aber es ermöglicht dem Benutzer, die ausgewählten Branches mit einer --dry-run
Option zu sehen.
Ich habe meine Datei git-prune-local
genannt und in einem Ordner abgelegt, der in meinem PATH
enthalten ist. Es benötigt auch Ausführungsberechtigungen (chmod 755 git-prune-local
).
Git sucht automatisch nach ausführbaren Dateien wie git-[command]
. Dadurch musst du 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 dem Server vorhanden sind
8 Stimmen
One-Liner, 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 weitere Details.0 Stimmen
Ich denke normalerweise, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da Sie sich sonst offenlegen, etwas zu löschen, das Sie nicht löschen wollten. Daher 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