it-swarm.com.de

Löschen Sie alle lokalen Git-Zweige

Ich folge einem Entwicklungsprozess, in dem ich für jedes neue Feature oder jede Story-Card einen neuen lokalen Zweig erstellt. Wenn ich fertig bin, füge ich den Zweig in master zusammen und drücke dann Push. 

Was im Laufe der Zeit aufgrund einer Kombination von Faulheit oder Vergesslichkeit passiert, ist, dass ich eine große Liste von lokalen Niederlassungen bekomme, von denen einige (z. B. Spikes) möglicherweise nicht zusammengeführt wurden.

Ich weiß, wie ich alle meine lokalen Filialen 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 Filialen löschen kann.

Unten ist die Ausgabe des Befehls git branch --merged.

[email protected]:~/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 Antworten unten) aufgelistet sind, 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) -freigabe
GNU grep 2.5.4 

208
Louth

Nur ein Hinweis, ich würde auf git 1.7.10 upgraden. Möglicherweise erhalten Sie hier Antworten, die bei Ihrer Version nicht funktionieren. Meine Vermutung ist, dass Sie dem Zweignamen refs/heads/ voranstellen müssten.

ACHTUNG: Fahren Sie mit den folgenden Schritten nur fort, wenn Sie eine Kopie Ihres Arbeitsordners und des .git-Verzeichnisses erstellt haben.

Manchmal mache ich einfach die Äste, die ich nicht direkt aus .git/refs/heads möchte. Alle diese Zweige sind Textdateien, die die 40 Zeichen sha-1 des Commit enthalten, auf den sie zeigen. In Ihrem .git/config haben Sie fremde Informationen, wenn Sie für ein bestimmtes Tracking ein bestimmtes Tracking eingerichtet haben. Sie können diese Einträge auch manuell löschen.

36
Adam Dymitruk

Der Unterbefehl 'git branch -d' kann mehrere Verzweigungen löschen. Vereinfachen Sie also die Antwort von @ sblom, fügen Sie jedoch wichtige Xargs hinzu:

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

oder weiter vereinfacht zu:

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

Wie von @AndrewC angemerkt, wird die Verwendung von git branch für die Skripterstellung dringend empfohlen. Um dies zu vermeiden, verwenden Sie Folgendes:

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

Vorsicht bei Löschungen geboten!

$ 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).
263
GoZoner

Ich fand einen schöneren Weg in einem Kommentar zu diesem Thema auf github :

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

edit: fügte keine Farboption hinzu und schließt stabile Verzweigungen aus (fügen Sie ggf. weitere Zweige hinzu)

121
mBardos

Das Analysieren der Ausgabe von git branch wird nicht empfohlen und ist keine gute Lösung für zukünftige Leser von Stack Overflow.

  1. git branch ist ein Porzellanbefehl. Porzellanbefehle können nicht maschinell analysiert werden, und die Ausgabe kann sich zwischen verschiedenen Git-Versionen ändern. 
  2. Es gibt Benutzerkonfigurationsoptionen, die die Ausgabe von git branch auf eine Weise ändern, die das Parsen erschwert (z. B. Kolorierung). Wenn ein Benutzer color.branch festgelegt hat, werden in der Ausgabe Steuercodes angezeigt. Dies führt zu error: branch 'foo' not found., wenn Sie versuchen, ihn in einen anderen Befehl umzuleiten. Sie können dies mit dem Flag --no-color zu git branch umgehen, aber wer weiß, welche anderen Benutzerkonfigurationen möglicherweise Probleme verursachen.
  3. git branch kann andere Dinge tun, die für die Analyse ärgerlich sind, z. B. Setzen Sie ein Sternchen neben den gerade ausgecheckten Zweig

Der Maintainer von git hat folgendes zu sagen über das Scripting um git branch Ausgabe

Um herauszufinden, was der aktuelle Zweig ist, haben gelegentliche/nachlässige Benutzer möglicherweise Skript um Git Zweig, das ist falsch. Wir raten aktiv ab gegen die Verwendung eines Porzellan-Befehls, einschließlich Git-Zweig, in Skripts, da die Ausgabe des Befehls in .__ geändert werden kann. Hilfe beim Konsum von Menschen.

Ähnlich problematisch sind Antworten, die die manuelle Bearbeitung von Dateien im Verzeichnis .git vorschlagen (wie .git/refs/heads) (Refs können stattdessen in .git/package-refs enthalten sein oder Git ändert in Zukunft sein internes Layout). 

Git bietet den Befehl for-each-ref zum Abrufen einer Liste von Zweigen. 

Git 2.7.X führt die --merged-Option ein, mit der Sie die folgenden Äste in HEAD suchen und löschen können. 

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

In Git 2.6.X und älter müssen Sie alle lokalen Niederlassungen auflisten und sie einzeln testen, um festzustellen, ob sie zusammengeführt wurden (was erheblich 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
67
Andrew C

So löschen Sie jeden Zweig außer dem, den Sie gerade ausgecheckt haben:

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done

Ich würde empfehlen, git branch -D $b in den ersten Male in einen echo $b zu ändern, um sicherzustellen, dass die gewünschten Zweige gelöscht werden.

45
sblom

Der einfachere Weg, um alle Zweige zu löschen, aber andere wie "Develop" und "Master" zu behalten, ist die folgende:

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

sehr hilfreich !

32
geoom

Ich fand es einfacher, Texteditor und Shell zu verwenden.

  1. Geben Sie git checkout <TAB> in der Shell ein. Zeigt alle lokalen Niederlassungen an.
  2. Kopieren Sie sie in einen Texteditor und entfernen Sie diejenigen, die Sie behalten müssen.
  3. Zeilenumbrüche durch Leerzeichen ersetzen. (In SublimeText ist das super einfach.)
  4. Öffnen Sie die Shell und geben Sie git branch -D <PASTE THE BRANCHES NAMES HERE> ein.

Das ist es.

23
culebrón

Mit dem folgenden Befehl werden alle lokalen Zweigstellen außer dem Master-Zweig gelöscht.

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

Der obige Befehl

  1. listen Sie alle Niederlassungen auf
  2. Ignoriere aus der Liste den Hauptzweig und nimm den Rest der Zweige
  3. löschen Sie den Zweig
21
Hunter

Ich hatte eine ähnliche Situation und fand den folgenden Befehl kürzlich für nützlich.

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`

Wenn Sie mehrere Zweige behalten möchten, dann

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`

hoffe das hilft jemandem.

11
4u.Ans

Wenn Sie Git nicht selbst durchlaufen müssen, können Sie die Köpfe unter .git/refs/heads manuell oder programmgesteuert löschen. Folgendes sollte mit minimalem Tweaking unter Bash funktionieren:

shopt -s extglob
rm -rf .git/refs/heads/!(master)

Dadurch wird jeder lokale Zweig außer Ihrem Hauptzweig gelöscht. Da Ihre Upstream-Zweigstellen unter .git/refs/remote gespeichert sind, bleiben sie unangetastet.

Wenn Sie nicht Bash verwenden oder viele Git-Repositories auf einmal rekursieren möchten, können Sie mit GNU etwas Ähnliches suchen:

find . \
    -path remotes -path logs -Prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

Die Suchlösung ist wahrscheinlich portabler, aber das Beschneiden von Pfaden und Dateinamen ist schwierig und möglicherweise fehleranfälliger.

7
Todd A. Jacobs

Zum Löschen aller lokalen Zweige in Linux mit Ausnahme von dem Zweig, in dem Sie sich befinden

// hard delete

git branch -D $(git branch)
5
ashish yadav

Keine der Antworten hat meine Bedürfnisse voll erfüllt, also gehen wir weiter:

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote Prune Origin

Dadurch werden alle lokalen Zweige gelöscht, die zusammengefügt werden und mit feature/, bugfix/ oder hotfix/ beginnen. Danach wird die Upstream-Fernbedienung Origin gelöscht (möglicherweise müssen Sie ein Kennwort eingeben).

Funktioniert auf Git 1.9.5.

4
user4401817

Basierend auf einer Kombination mehrerer Antworten hier - wenn Sie alle auf remote vorhandenen Zweige beibehalten möchten, aber den Rest löschen möchten , erledigt der folgende Oneliner den Vorgang:

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads Origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D
3

Löschen Sie in der Windows-Befehlszeile alle außer der aktuellen ausgecheckten Verzweigung mit:

for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f
1
kiewic

Die obigen Antworten funktionieren einwandfrei. Hier ist ein anderer Ansatz, wenn wir viele Zweige in lokalem Repository haben und wir viele Zweige löschen müssen, mit Ausnahme weniger, die in lokaler Maschine liegen.

Zuerst listet git branch Alle lokalen Zweige auf.

So transponieren Sie die Spalte mit den Zweignamen in eine einzelne Zeile in der Datei, indem Sie einen Unix-Befehl ausführen
git branch > sample.txt
Dadurch wird es in der Datei sample.txt gespeichert. Und Renn
awk 'BEGIN { ORS = " " } { print }' sample.txt
Befehl in Shell. Dadurch wird die Spalte in eine Zeile umgewandelt und die Liste der Zweignamen in eine einzelne Zeile kopiert.

Und dann renn
git branch -D branch_name(s).
Dadurch werden alle in local vorhandenen aufgelisteten Zweige gelöscht

0
Deepak G

Der pragmatischste Weg: Stellen Sie sicher, dass Sie nicht uneingeschränkt an master arbeiten, verpflichten Sie sich/Push, falls erforderlich, klonen Sie eine neue Kopie des Repository und löschen Sie die alte.

0
Patrick Sanan

Ich habe ein Shell-Skript geschrieben, um alle lokalen Zweige mit Ausnahme von develop zu entfernen.

branches=$(git branch | tr -d " *")
output=""
for branch in $branches 
do
  if [[ $branch != "develop" ]]; then
    output="$output $branch"
  fi
done
git branch -d $output
0
nhp

Das folgende Skript löscht Zweige. Verwenden Sie es und ändern Sie es auf eigenes Risiko usw. usw.

Basierend auf den anderen Antworten in dieser Frage schrieb ich schließlich ein kurzes Bash-Skript für mich. Ich habe es "gitbd" (git branch -D) genannt, aber wenn Sie es verwenden, können Sie es nach Belieben umbenennen.

gitbd() {
if [ $# -le 1 ]
  then
    local branches_to_delete=`git for-each-ref --format '%(refname:short)' refs/heads/ | grep "$1"`
    printf "Matching branches:\n\n$branches_to_delete\n\nDelete? [Y/n] "
    read -n 1 -r # Immediately continue after getting 1 keypress
    echo # Move to a new line
    if [[ ! $REPLY == 'N' && ! $REPLY == 'n' ]]
      then
        echo $branches_to_delete | xargs git branch -D
    fi
else
  echo "This command takes one arg (match pattern) or no args (match all)"
fi
}

Es wird angeboten, alle Verzweigungen zu löschen, die einem Musterargument entsprechen, wenn übergeben, oder alle lokalen Verzweigungen, wenn sie ohne Argumente aufgerufen werden. Es gibt auch einen Bestätigungsschritt, da wir Dinge löschen, das ist Nizza.

Es ist irgendwie dumm - wenn es keine Äste gibt, die mit dem Muster übereinstimmen, erkennt es dies nicht.

Ein Beispielausgabelauf:

$ gitbd test
Matching branches:

dummy+test1
dummy+test2
dummy+test3

Delete? [Y/n] 
0
dherman

Für Powershell wird dies funktionieren:

git branch --format '%(refname:lstrip=2)' --merged `
    | Where-Object { $_ -ne 'master' } `
    | ForEach-Object { git branch -d $_ }
0
Lucas

Stellen Sie sicher, dass Sie dies zuerst tun

git fetch

Wenn Sie alle Informationen zu fernen Zweigen haben, können Sie mit dem folgenden Befehl alle Zweige mit Ausnahme von master entfernen.

 git branch -a | grep -v "master" | grep remotes | sed 's/remotes\/Origin\///g' | xargs git Push Origin --delete
0
Meng

Obwohl dies keine Befehlszeilenlösung ist, bin ich überrascht, dass die Git-GUI noch nicht vorgeschlagen wurde.

Ich benutze die Befehlszeile zu 99% der Zeit, aber in diesem Fall ist es entweder zu langsam (daher die ursprüngliche Frage), oder Sie wissen nicht, was Sie löschen möchten, wenn Sie zu einer längeren, aber cleveren Shell-Manipulation greifen.

Die Benutzeroberfläche löst dieses Problem, da Sie die zu entfernenden Zweige schnell abhaken können und an diejenigen erinnert werden, die Sie behalten möchten, ohne dass Sie für jeden Zweig einen Befehl eingeben müssen.

Gehen Sie von der Benutzeroberfläche zu Branch -> Delete und Ctrl +. Klicken Sie auf die zu löschenden Zweige, damit sie hervorgehoben werden. Wenn Sie sicher gehen möchten, dass sie in einem Zweig (z. B. dev) zusammengeführt werden, setzen Sie unter Nur löschen, wenn in zusammengefügt [] wird Lokaler Zweig auf dev. Andernfalls setzen Sie es auf Always, um diese Prüfung zu ignorieren. 

 GitUI: delete local branches

0
Dane Bouchie