1366 Stimmen

Wie man lokale Tracking-Branches beschneidet, die auf dem Remote nicht mehr vorhanden sind?

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

Aber ich möchte auch die lokalen Branches entfernen, die von diesen Remote-Branches erstellt wurden (eine Überprüfung, ob sie nicht gemergt 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 (Probelauf) oder npx 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.

4voto

Ali Farhoudi Punkte 4020

Sie können dies durch ein paar einfache Aktionen tun:

  • Geben Sie alle Ihre Zweige in eine temporäre Datei aus:

    git branch > branches.tmp

  • Öffnen Sie die Datei und entfernen Sie Zweige, um sie von der Löschung im lokalen (Zweige wie develop/master/main/...) auszuschließen

  • Leiten Sie die Zweigsnamen an xargs mit dem cat Befehl weiter und entfernen Sie die Zweige:

    cat branches.tmp | xargs git branch -D

4voto

NHDaly Punkte 6719

Nicht sicher, wie man alles auf einmal macht, aber git git branch -d löscht einen lokalen Branch NUR, wenn er vollständig gemerged ist. Beachten Sie das kleine d.

git branch -D (beachten Sie das große D) löscht einen lokalen Branch unabhängig von seinem Merge-Status.

0 Stimmen

Auf Windows haben die anderen Antworten für mich nicht funktioniert. Die Verwendung dieser Antwort mit dem einfachen -D-Schalter hat funktioniert (auch wenn der Zweig bereits "gelöscht" worden war).

0 Stimmen

Können wir es für alle Zweige auf einmal machen?

3voto

Shane K Punkte 4455

Auf Windows mit Powershell, um alle lokalen Branches zu löschen, die auf dem Remote-Server gelöscht wurden, unabhängig vom Merge-Status, funktioniert dies:

git fetch -p
git branch --v | ? {$_.contains('[gone]')} | % {$_.trim().split()[0].trim()} | % {git branch -D $_}
  • git branch --v Gibt eine detaillierte Liste Ihrer Branches aus, einschließlich des [gone]-Status
  • ? {$_.contains('[gone]')} True, wenn [gone] vorhanden ist
  • % {$_.trim().split()[0].trim()} Gibt uns nur den Branch-Namen aus
  • % {git branch -D $_} Erzwinge das Löschen des lokalen Branches, auch wenn er nicht gemerged ist

Wenn Sie nicht gemergte Branches vermeiden möchten, ändern Sie -D in -d und behandeln Sie diese manuell.

3voto

spume Punkte 1314

Dies funktioniert für mich mit git 2.21.0 - es löscht lokale Tracking-Branches, die in HEAD zusammengeführt wurden, wo ich zuvor --set-upstream beim Pushen verwendet habe (ich benutze push.default=upstream, weil es mit mehreren Remotes am besten funktioniert) und dieser Upstream-Branch dann durch ein fetch --prune (oder implizit, wenn fetch.prune=true in der git-Konfiguration) gelöscht wurde:

git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Die Verwendung von --merged und -d machen dies zu einem sehr 'sicheren' Löschen. Eine aggressivere Version könnte das --merged fallen lassen und -D verwenden

0 Stimmen

Bitte beachten Sie, dass Sie einen Branch auschecken müssen, der einem vorhandenen Remote-Branch folgt, sonst wird der Befehl direkt vor dem Piping zu xargs stattdessen * den Branch-Namen zurückgeben. Mein Vorschlag lautet, git checkout master; git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d zu verwenden.

3voto

daniilyar Punkte 2502

Schleis' Variante funktioniert bei mir nicht (Ubuntu 12.04), daher möchte ich meine (klare und glänzende :) Varianten vorschlagen:

Variante 1 (ich würde diese Option bevorzugen):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Variante 2:

a. Trockendurchlauf:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b. Branches entfernen:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

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