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.

3voto

sendon1982 Punkte 8352

Sie können diesen Befehl verwenden:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git säubern: Bereits zusammengeführte Branches löschen einschließlich Aufschlüsselung des Befehls

0 Stimmen

Du musst wirklich keine Zweige filtern (zum Beispiel master). Wenn es "gemerged" ist, bedeutet das nur, dass es deine lokale Kopie entfernt, aber "git checkout dev" wird einen lokalen Zweig von remote erstellen, wenn er noch nicht vorhanden ist.

0 Stimmen

Aber die lokalen Zweige sind immer noch vorhanden, auch wenn sie zusammengeführt wurden. Dieser Befehl soll diese Zweige entfernen, die von Remote gelöscht wurden.

0 Stimmen

Ein Asterisk am Anfang bedeutet den aktuellen Branch, wenn Sie diesen Befehl auf einem anderen Branch ausführen, funktioniert es nicht richtig.

2voto

Kgeorge Punkte 136

Die Powershell-Version von git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Dies wird alle lokalen Branches entfernen, die in den Master gemerged wurden, während du dich im Master-Branch befindest.

git checkout master um zu wechseln.

2voto

gagarwal Punkte 4214

Ausgehend von den obigen Antworten bin ich auf diese einzeilige Lösung gekommen:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

2voto

Sam C Punkte 303

Nachfolgend eine Anpassung von @wisbuckys Antwort für Windows-Benutzer:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

Ich benutze posh-git und leider mag PS das nackte for nicht, daher habe ich ein einfaches Befehlsskript namens PruneOrphanBranches.cmd erstellt:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Branch [%1] wird gelöscht 
GOTO :EOF

:EOF

Rufen Sie es ohne Parameter auf, um eine Liste zu sehen, und rufen Sie es dann mit "-d" auf, um die tatsächliche Löschung durchzuführen oder mit "-D" für Branches, die nicht vollständig gemerged sind, aber die Sie trotzdem löschen möchten.

0 Stimmen

Das hat bei mir nicht funktioniert, irgendwie hat das : oder : (mit einem Leerzeichen) in findstr dazu geführt, dass es jedes Mal alles abgeglichen hat - ich hätte beinahe den Master gelöscht. Allerdings hat die Verwendung eines Regex gut funktioniert: git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "

2voto

Ken Williams Punkte 21163

Unter Verwendung einer Variante von @wisbucky's Antwort habe ich folgendes als Alias zu meiner ~/.gitconfig Datei hinzugefügt:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

Damit kann durch einfaches Ausführen von git pruneitgood sowohl lokale als auch entfernte Branches aufgeräumt werden, die nach Merges nicht mehr benötigt werden.

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