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-Server sind.

Aber ich möchte auch die lokalen 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 tun?

12 Stimmen

8 Stimmen

One-Liner, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner 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 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.

8voto

Macadameane Punkte 149

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"

8voto

Evert_B Punkte 160

Sie können die --no-contains Option verwenden, um zu verhindern, dass Ihr master Branch beim Verwenden des --merged Branchs entfernt wird.

Wenn Sie alleine laufen, sieht es so aus

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

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

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

Um die Branches 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() } )

would be translated to

In Powershell:

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

5voto

Chui Tey Punkte 5315

Auf OS X, das cut -w unterstützt

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

Erklärung

folgende Branches löschen
git branch -d ...

entfernte Branches anzeigen

$ git branch -vv | grep ': gone]'
  chore/TECH-456   a4bdac8ac8 [origin/TECH-456: gone] chore: syntax error
  feature/TECH-678 0342f8e277 [origin/feature/TECH-678: gone] Added IsGross in new Income Details

den Branch-Namen behalten

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

5voto

hidralisk Punkte 676

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

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

Außerdem, wenn du bereits "gepruned" hast und lokale 'dangling' Branches hast, dann werden diese bereinigt:

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

1 Stimmen

Funktioniert nicht, wenn Ihre Zweig-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