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.

3voto

sendon1982 Punkte 8352

Sie können diesen Befehl verwenden:

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

Git Clean: Bereits zusammengeführte Branches löschen inklusive Aufschlüsselung des Befehls

0 Stimmen

Du musst eigentlich keine Branches filtern (z. B. Master). Wenn es "merged" ist, bedeutet dies nur, dass es Ihre lokale Kopie entfernen wird, aber "git checkout dev" wird einen lokalen Branch vom Remote erstellen, wenn nicht bereits vorhanden.

0 Stimmen

Aber die lokale Zweigliste ist immer noch vorhanden, auch wenn sie zusammengeführt wurden. Dieser Befehl dient dazu, diese Zweige zu entfernen, die von Remote gelöscht wurden.

0 Stimmen

Ein Asterisk am Anfang bedeutet den aktuellen Zweig, wenn Sie diesen Befehl auf einem anderen Zweig ausführen, wird er nicht gut funktionieren

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 entfernt alle lokalen Branches, die in den Master gemerged wurden, während du auf dem Master-Branch bist.

git checkout master zum Wechseln.

2voto

gagarwal Punkte 4214

Ausgehend von den obigen Antworten kam ich zu dieser einzeiligen Lösung:

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

Im Folgenden handelt es sich um eine Anpassung von @wisbucky's Antwort für Windows-Benutzer:

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

Ich verwende posh-git und leider mag PS das nackte for nicht, also 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 Wird Branch löschen [%1] 
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 "-D" für Branches, die nicht vollständig zusammengeführt 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 übereinstimmt - ich hätte beinahe den Master gelöscht. Mit einem Regex hat es jedoch 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"

Mit diesem Befehl wird ein einfaches git pruneitgood sowohl lokale als auch entfernte Branches aufräumen, die nach dem Zusammenführen 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