Dieser Befehl und das Skript unten funktionieren in 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 Branch löschen, den man nicht löschen möchte. 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 die Weiterleitung an awk
oder grep
verlassen, um einen regulären Ausdruck auf Ausgaben zu überprüfen, die unnötige Informationen enthalten können.
Der folgende Befehl verwendet nur die internen Niedrigpegelbefehle von git for-each-ref
, um nur verwaiste lokale Branches aufzulisten. Wenn Sie diese haben, können Sie sie an git branch -D
weiterleiten. Vergessen Sie auch nicht, Ihre Remote-Referenzen zuerst zurückzuschneiden und zu holen, sonst findet es keine Übereinstimmungen:
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 zurückführen und neue von der Remote holen
git for-each-ref --format
- listet alle Referenzen mit einem bestimmten Ausgabeformat auf.
%(if:equals=[gone])%(upstream:track)
- Ausgabe nur wenn der Upstream-Tracking-Branch "[gone]" ist.
%(then)%(refname:short)%(end)
- gib den Branch-Namen aus (wenn das Tracking weg ist).
refs/heads/**
- beschränken auf Kopfreferenzen (für Effizienz).
| xargs -r git branch -D
- leite die Ausgabe als Parameter für die Löschung. 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. Glücklicherweise ist es einfach, benutzerdefinierte Befehle zu git hinzuzufügen. Hier ist ein Skript, das denselben Befehl wie oben verwendet, es ermöglicht dem Benutzer jedoch, 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-[Befehl]
. 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 Remote sind
8 Stimmen
One-Liner, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner Tastatur geschlafen:
npx git-removed-branches
(Probelauf) odernpx 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.
3 Stimmen
Für IntelliJ-Benutzer bietet das folgende Plugin genau das, was Sie benötigen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner