1366 Stimmen

Wie kann man lokale Tracking-Branches beschneiden, die nicht mehr auf dem Remote existieren?

Mit git remote prune origin kann ich die lokalen Branches entfernen, die nicht mehr auf dem Remote vorhanden sind.

Aber ich möchte auch lokale Branches entfernen, die von diesen Remote-Branches erstellt wurden (eine Überprüfung, ob sie nicht zusammengeführt wurden, wäre nett).

Wie kann ich das machen?

12 Stimmen

8 Stimmen

Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf Ihrer Tastatur geschlafen: npx git-removed-branches (Trockenlauf) oder npx 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.

8voto

Macadameane Punkte 149

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"

8voto

Evert_B Punkte 160

Sie können die --no-contains Option verwenden, um Ihren master Zweig beim Verwenden von --merged nicht zu entfernen.

Wenn Sie das alleine ausführen, sieht es so aus

$ git branch --no-contains master --merged master
    old-branch1
    old-branch2
    old-branch3

Um die Zweige in der Unix-Shell mit xargs zu löschen

git branch --no-contains master --merged master | xargs git branch -d

Um die Zweige in Powershell mit Pipes zu löschen

git.exe branch --no-contains master --merged master `
    | foreach { git.exe branch -v -d $_.Trim() }

6voto

In Powershell:

git branch -D (git branch --merged |% { $_.trim() } )

Übersetzung:

In Powershell:

git-Zweig -D (git-Zweig --zusammenführen |% { $_.trim() })

5voto

Chui Tey Punkte 5315

Unter OS X, das cut -w unterstützt

git branch -d $(git branch -vv | grep ': gone]' | cut -w -f 2 )

Erklärung

Löschen der folgenden Branches
git branch -d ...

Angezeigte entfernte Branches

$ git branch -vv | grep ': gone]'
  chore/TECH-456   a4bdac8ac8 [origin/TECH-456: gone] chore: Syntaxfehler
  feature/TECH-678 0342f8e277 [origin/feature/TECH-678: gone] Hinzufügen von IsGross in neuen Einkommensdetails

Behalte den Branch-Namen bei

$ git branch -vv | grep ': gone]' | cut -w -f 2
chore/TECH-456
feature/TECH-678

5voto

hidralisk Punkte 676

Basierend auf den oben genannten Antworten verwende ich diese kürzere Einzeiler:

git remote prune origin | awk 'BEGIN{FS="origin/"};/geputzt/{print $2}' | xargs -r git branch -d

Außerdem, wenn du bereits aufgeräumt hast und lokale verwaiste Branches hast, dann wird das sie aufräumen:

git branch -vv | awk '/^ .*weg/{print $1}' | xargs -r git branch -d

1 Stimmen

Funktioniert nicht, wenn Ihre Branch-Namen ein / enthalten.

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