622 Stimmen

Alle lokalen Git-Zweige löschen

Ich folge einem Entwicklungsprozess, bei dem ich für jede neue Funktion oder Storycard einen neuen lokalen Zweig erstelle. Wenn ich fertig bin, führe ich den Zweig mit Master zusammen und veröffentliche ihn dann.

Was im Laufe der Zeit durch eine Kombination aus Faulheit und Vergesslichkeit passiert, ist, dass ich am Ende eine große Liste lokaler Zweige habe, von denen einige (wie z.B. Spikes) vielleicht noch nicht zusammengeführt wurden.

Ich weiß, wie ich alle meine lokalen Zweige auflisten kann und ich weiß, wie ich einen einzelnen Zweig entfernen kann, aber ich habe mich gefragt, ob es einen Git-Befehl gibt, mit dem ich alle meine lokalen Zweige löschen kann?

Nachfolgend ist die Ausgabe des git branch --merged Befehl.

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

Alle Versuche, Zweige zu löschen, die mit grep -v \* (gemäß den nachstehenden Antworten) führen zu Fehlern:

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

Ich benutze:

git 1.7.4.1  
ubuntu 10.04  
GNU bash, version 4.1.5(1)-release  
GNU grep 2.5.4

751voto

GoZoner Punkte 63309

Der Unterbefehl "git branch -d" kann mehr als einen Zweig löschen. Vereinfacht man also die Antwort von @sblom, fügt man aber ein kritisches xargs hinzu:

git branch -D `git branch --merged | grep -v \* | xargs`

oder, weiter vereinfacht, zu:

git branch --merged | grep -v \* | xargs git branch -D 

Wichtig ist, dass als bemerkt von @AndrewC , mit git branch für Skripting wird abgeraten. Um dies zu vermeiden, verwenden Sie etwas wie:

git for-each-ref --format '%(refname:short)' refs/heads | grep -v "master\|main" | xargs git branch -D

Vorsicht bei Löschungen!

$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
  Story-123-a
  Story-123-b
  Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).

385voto

geoom Punkte 3605

Der einfachere Weg, alle Zweige zu löschen, aber andere wie "develop" und "master" beizubehalten, ist der folgende:

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

sehr nützlich!

196voto

mBardos Punkte 2607

Ich habe einen schöneren Weg gefunden in einem Kommentar zu diesem Thema auf Github :

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

bearbeiten : Option no-color und Ausschluss des stabilen Zweigs hinzugefügt (andere Zweige nach Bedarf hinzufügen)

171voto

Andrew C Punkte 12890

Parsen der Ausgabe von git branch wird nicht empfohlen und ist keine gute Antwort für zukünftige Leser von Stack Overflow.

  1. git branch ist ein so genannter Porzellanbefehl. Porcelain-Befehle sind nicht dafür ausgelegt, maschinell geparst zu werden, und die Ausgabe kann sich zwischen verschiedenen Versionen von Git ändern.
  2. Es gibt Benutzerkonfigurationsoptionen, die die Ausgabe von git branch in einer Weise, die das Parsen erschwert (z. B. Einfärbung). Wenn ein Benutzer Folgendes festgelegt hat color.branch dann erhalten Sie Kontrollcodes in der Ausgabe, was dazu führt, dass error: branch 'foo' not found. wenn Sie versuchen, es in einen anderen Befehl zu integrieren. Sie können dies mit der Option --no-color Flagge zu git branch aber wer weiß, welche anderen Benutzerkonfigurationen zu Problemen führen könnten.
  3. git branch kann andere Dinge tun, die beim Parsen lästig sind, wie ein Sternchen neben den aktuell ausgecheckten Zweig setzen

En Maintainer von git hat folgendes zu sagen über das Skripting um git branch Ausgabe

Um herauszufinden, was der aktuelle Zweig ist, können gelegentliche/unvorsichtige Benutzer mit ein Skript um git branch herum geschrieben, was falsch ist. Wir raten aktiv davon ab von der Verwendung jedes Porcelain-Befehls, einschließlich git branch, in Skripten ab, da sich die Ausgabe des Befehls ändern kann, um dem menschlichen Konsum zu helfen.

Antworten, die eine manuelle Bearbeitung von Dateien in der .git Verzeichnis (wie .git/refs/heads) sind ähnlich problematisch (refs können stattdessen in .git/packed-refs liegen, oder Git kann sein internes Layout in Zukunft ändern).

Git bietet die for-each-ref um eine Liste der Zweige abzurufen.

Mit Git 2.7.X wird die --merged Option zu, so dass Sie etwas wie das Folgende tun können, um alle Zweige zu finden und zu löschen, die in HEAD

for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
    git branch -d ${mergedBranch}
done

Git 2.6.X und älter, müssen Sie alle lokalen Zweige auflisten und sie dann einzeln testen, um zu sehen, ob sie zusammengeführt wurden (was deutlich langsamer und etwas komplizierter ist).

for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
    git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done

127voto

Pravin Bansal Punkte 3307

Versuchen Sie den folgenden Shell-Befehl:

git branch | grep -v "master" | xargs git branch -D

Erläuterung:

  • Holen Sie sich alle Zweige (außer dem Master) über git branch | grep -v "master" Befehl
  • Wählen Sie jeden Zweig mit xargs Befehl
  • Zweig löschen mit 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