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

Aber ich möchte auch lokale 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 machen?

12 Stimmen

8 Stimmen

Einzeiler, plattformübergreifend, sieht nicht aus, als hätte die Katze auf Ihrer 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 normalerweise, dass diese Dinge absichtlich und nicht automatisch gemacht werden sollten, da Sie sich ansonsten selbst dem Risiko aussetzen, etwas zu löschen, das Sie nicht löschen wollten. Also 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 einschließlich Aufschlüsselung des Befehls

0 Stimmen

Du musst nicht wirklich alle Zweige filtern (z. B. Master). Wenn es "zusammengeführt" 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 lokale Zweigliste ist immer noch da, auch wenn sie zusammengeführt wurden. Dieser Befehl dient dazu, diese Zweige zu entfernen, die von Remote gelöscht wurden.

0 Stimmen

Sternchen am Anfang bedeutet aktuellen Branch, wenn Sie diesen Befehl auf einem anderen Branch ausführen, funktioniert es nicht gut

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 im Master-Branch bist.

git checkout master zum Wechseln.

2voto

gagarwal Punkte 4214

Basiert auf den obigen Antworten habe ich diese einzeilige Lösung entwickelt:

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 finden Sie eine Adaption der Antwort von @wisbucky 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, deshalb 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 Lösche Branch [%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 mit "-D" für alle Branches, die nicht vollständig zusammengeführt sind, aber die Sie trotzdem löschen möchten.

0 Stimmen

Dies hat für mich nicht funktioniert, irgendwie hat das : oder : (mit einem Leerzeichen) in findstr dazu geführt, dass es jedes Mal alles übereinstimmt - ich habe beinahe 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 @wisbuckys 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 können mit git pruneitgood sowohl lokale als auch entfernte Branches aufgeräumt werden, 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