1366 Stimmen

Wie kann man lokale Tracking-Zweige beschneiden, die nicht mehr auf dem Remote vorhanden sind?

Mit git remote prune origin kann ich die lokalen Branches entfernen, die nicht mehr auf dem Remote vorhanden 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

Einzeiler, 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 Details.

0 Stimmen

Ich denke in der Regel, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da Sie sich sonst dem Risiko aussetzen, etwas zu löschen, das Sie nicht löschen wollten. 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 einige einfache Aktionen erreichen:

  • Geben Sie alle Ihre Zweige in eine Tempdatei aus:

    git branch > branches.tmp

  • Öffnen Sie die Datei und entfernen Sie Zweige, um sie davon abzuhalten, von Ihrem lokalen (Zweige wie entwickeln/master/main/...) gelöscht zu werden

  • Übergeben Sie die Zweig-Namen an xargs über den Befehl cat und entfernen Sie die Zweige:

    cat branches.tmp | xargs git branch -D

4voto

NHDaly Punkte 6719

Bin mir nicht sicher, wie man alles auf einmal macht, aber git git branch -d wird einen lokalen Branch nur löschen, wenn er vollständig gemerged ist. Beachten Sie das kleinbuchstabige d.

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

0 Stimmen

Auf Windows haben die anderen Antworten nicht funktioniert. Die Verwendung dieser Antwort mit dem einfachen -D-Schalter hat bei mir funktioniert (obwohl der Zweig bereits "gelöscht" worden war).

0 Stimmen

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

3voto

Shane K Punkte 4455

Unter Windows mit Powershell können Sie alle lokalen Branches löschen, die unabhängig vom Merge-Status auf dem Remote-Server gelöscht wurden, mit folgendem Befehl:

git fetch -p
git branch --v | ? {$_.contains('[gone]')} | % {$_.trim().split()[0].trim()} | % {git branch -D $_}
  • git branch --v Gibt eine ausführliche Liste Ihrer Branches zurück, darunter auch der Status [gone]
  • ? {$_.contains('[gone]')} True, wenn [gone] vorhanden ist
  • % {$_.trim().split()[0].trim()} Gibt uns nur den Branch-Namen zurück
  • % {git branch -D $_} Erzwingt das Löschen des lokalen Branches, auch wenn er nicht gemerged wurde

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 gemerged sind, auf denen ich zuvor --set-upstream beim Push verwendet habe (ich verwende push.default=upstream, weil es mit mehreren Remotes am besten funktioniert) und dieser Upstream-Branch wurde inzwischen gelöscht durch ein fetch --prune (oder implizit, wenn fetch.prune=true in der Git-Konfiguration ist):

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 weglassen und -D verwenden.

0 Stimmen

Beachten Sie, dass Sie einen Branch auschecken müssen, der einem vorhandenen Remote-Branch entspricht, da sonst der Befehl direkt vor der Weiterleitung an xargs * anstelle des Branch-Namens zurückgibt. Mein Vorschlag ist, 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 für mich nicht (Ubuntu 12.04), daher möchte ich meine (klar und glänzend :) Varianten vorschlagen:

Varainte 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 

Varainte 2:

a. Trockenlauf:

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