Löschen Sie mehrere Remote-Zweige in Git

128

Ich habe ein Teammitglied, das versehentlich über 150 seiner lokalen Niederlassungen in unser zentrales Repo gebracht hat. Zum Glück haben alle das gleiche Präfix. Gibt es mit diesem Präfix einen git-Befehl oder ein cooles kleines Shell-Skript, mit dem ich alle auf einmal löschen kann?

Jake A. Smith
quelle

Antworten:

150

Verwenden Sie den folgenden Befehl, um alle Zweige mit PREFIXPräfix auf dem Remote-Server zu entfernen .

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

Möglicherweise möchten Sie zuerst einen Probelauf durchführen, um festzustellen, ob Sie die Zweige entfernen möchten:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'
neevek
quelle
2
Ich mag das, weil es ein Einzeiler ist und ich zuerst einen Trockenlauf machen kann. Leider gibt es Fehler mit dieser Nachricht: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
Jake A. Smith
Mit git branch -r | awk -F/ '/\/APR/{print $2}'könnte sehen Sie alle der APR Präfix Zweig Namen aufgelistet?
Neevek
1
OK, weil der APR-04-DPHZweig bereits gelöscht wurde. Schauen Sie sich diese beantworteten Fragen an: dies und das und auch das . Antworten auf diese Fragen beziehen sich auf dasselbe Problem. Möglicherweise möchten Sie die Lösungen selbst testen.
neevek
26
Wenn Sie / in Ihren Filialnamen haben (wenn Sie Git-Flow oder etwas verwenden), drucken Sie stattdessen {$ 2 "/" $ 3}
Ajma
4
Ich verwende msysgit in Windows und der folgende Befehl hat für mich funktioniert (in Verbindung mit @ ajmas Kommentar für Zweignamen, die Schrägstriche enthalten:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe
96

Wenn Sie einen einfacheren Ansatz bevorzugen, löschen Sie beispielsweise 3 oder 4 Zweige:

git push origin --delete <branch1> <branch2> <branch3>

Wichtig: Funktioniert nur mit Git v1.7.0 und höher.

jfeston
quelle
6
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan
36

Vielen Dank an Neevek für die großartige und elegante Lösung!

Aber ich habe einige Probleme mit Schrägstrichen in Zweignamen (ich verwende Git Flow), wegen des awkFeldtrennzeichens /( -FOption)

Meine Lösung basiert also auf der von Neevek , analysiert aber die Filialnamen korrekt mit /. In diesem Fall gehe ich davon aus, dass Ihre Fernbedienung angerufen hat origin. Befehl zum Löschen entfernter Zweige mit Namen, die auf Folgendes starren PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

Und vergessen Sie nicht zu überprüfen, was Sie löschen werden:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

NÜTZLICHER TIPP: Wenn Ihre Filialnamen (ohne origin/Präfix) in einer Textdatei gespeichert sind (ein Filialname pro Zeile), führen Sie einfach Folgendes aus:

cat your_file.txt | xargs -I {} git push origin :{}
Dmitriy
quelle
2
Verwenden Sie xargs -a file -Lanstelle von cat file | xargs. Noch einfacher xargs -a file git push --delete origin.
musiKk
15

Dies mag eine doppelte Antwort sein, aber unten getestet und für mich perfekt funktioniert.

  1. Löschen Sie den lokalen Zweig mit Nachdruck

Git-Zweig -D Zweig-Name

  1. Remote-Zweig löschen

git push origin - Branchenname löschen

  1. Löschen Sie mehr als einen lokalen Zweig

Git-Zweig -D Zweig-Name1 Zweig-Name2

  1. Löschen Sie mehr als einen Remote-Zweig

git push origin - Branchenname löschen1 Filialname2

  1. Lokalen Zweig mit Präfix löschen. Zum Beispiel Feature / *

Git-Zweig -D $ (Git-Zweig - Liste 'Feature / *')

Git Branch -D Backticks $ (Git Branch - List 'Feature / *' Backticks )

  1. Listet den Remote-Zweig mit dem Präfix auf.

Git-Zweig -r | grep -Eo 'feature /.*'

  1. Remote-Zweig mit Präfix löschen

Git-Zweig -r | grep -Eo 'feature /.*' | xargs -I {} git push origin: {}

Naren
quelle
2
Ich denke, Sie wollten den Backticks in Schritt 5
GPL
Wie füge ich Backticks hinzu?
Naren
1
@Naren: Das Problem ist, dass die Markdown-Formatierung Ihre Backticks in einen Styling-Befehl verwandelt. Ich habe sie durch eine andere Befehlsersetzungsmethode ersetzt (z. B. "$ (Befehl)" entspricht "Befehl", wird aber nicht durch Abschriften in etwas Seltsames übersetzt.) Das andere, was Sie tun können, ist, den Backticks mit "\" zu entkommen.
Stabledog
13

Das gleiche gilt für grep : git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}.

branch -rzeigt origin/prefix/branchname. Also wird es dauern prefix/branchname.

Kirby
quelle
Ich denke du meintest xargs -I {} git push origin :{}nicht -i.
Jojo
1
@jojo, AFAIK, da -ies den Standardersatz für verwendet, {}aber mit -IIhnen können Sie Ihren eigenen deklarieren. ... gerade im Handbuch gefunden:-i ... the same as -I{}
Kirby
10

Die Lösung von Neevek ist elegant, kann aber auch besser sein: Die vorgeschlagene Lösung nennt "Git Push" einmal pro Zweig, was bedeutet, dass ein zusätzlicher Netzwerk-Roundtrip pro Zweig gelöscht werden muss. Da Sie ohnehin awk verwenden, können Sie damit das ':' voranstellen. Xargs kann dann 'git push' genau einmal aufrufen und alle Zweige gleichzeitig löschen:

Trockenlauf, um die zu löschenden Zweige aufzulisten:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

Endgültige Lösung, um die Löschvorgänge tatsächlich zu verschieben:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin
Mangel
quelle
2
Es funktioniert perfekt in der Situation, dass Sie die Option "-I" für xargs nicht verwenden können, wenn Sie eine Bash mit niedrigerer Version oder eine Git-Bash mit Windows-Version verwenden.
Zchholmes
Ich hatte eine xargs: replstr may not be emptymit Neeveks Lösung, vielleicht eine Git-Version. git version 1.9.5Aber das hat bei mir großartig funktioniert. Vielen Dank an euch beide
IamFace
8

Ressource https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin
Ashish Sajwan
quelle
Danke, das hat bei mir funktioniert. In meinem Fall könnte ich mehrere lokale Zweige löschen. Vielen Dank!
Prashant Kabade
5

Dank Steve und Neevek habe ich eine Lösung gefunden, die für mich ziemlich gut funktioniert hat.

Steves Lösung funktionierte für mich mit einer kleinen Anpassung. Meine Fernbedienungen wurden benannt, origin/feature/some-feature-namealso habe ich Ihre gekürzt awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

Es macht jetzt einen schönen kleinen Löschfluss:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

Ich habe mich gefragt, ob jemand Ideen für eine elegantere Lösung hat, die so etwas ausgeben könnte (mein CLI-Skript ist ziemlich schlecht, daher würde ich eine Weile brauchen, um das herauszufinden):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

Dies würde zu einer schönen Einzelausgabe mit einer Netzwerkanforderung führen:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk
andrewmart.in
quelle
4

Danke an Neevek. Dies funktionierte gut, nachdem ich es für meinen Zweck neu konfiguriert hatte:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

Ich musste auch die Ordnerstruktur berücksichtigen. Meine Feature-Zweige befinden sich in einer Ordnerstruktur wie origin / feature / PREFIX-FEATURENUMBER. Also musste ich mein Muster aus $ 2 = Ordner + $ 3 = Zweigname aufbauen.

user3416278
quelle
4

Jeder benutzt awk, nicht sicher warum. Ich denke, das ist komplexer. Folgendes lösche ich, um alle Remote-Zweige auf meiner forkRemote zu löschen :

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

Geben Sie grepzwischen xargsund ein, sedwenn Sie die Liste nur auf eine Teilmenge der Remote-Zweige filtern müssen.

void.pointer
quelle
1
Vielen Dank. Dieser funktionierte tatsächlich für mich unter allen Lösungen. Grep gab auch den vollständigen Zweig mit dem Namen der Fernbedienung zurück origin/blaprefix_anotherbla. Aber mit gut damit sedumgegangen. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass ich Bitbucket verwende und nicht bei jeder Zweiglöschung manuell ein Authentifizierungskennwort eingeben muss. Dieser löscht alle Zweige in einem einzigen Stapel.
Madhur Bhaiya
So löschen Sie alle Greenkeeper-Zweigegit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
abhisekp
4

Mir ist klar, dass dies für den Befehl git ist, aber wenn Sie nach einer alternativen Lösung suchen, um das gleiche oder das gleiche Ergebnis zu erzielen:

Sie können dies von hier aus tun (Git Remove Remote Branches):

Wählen Sie dann die gewünschten Zweige aus:

Stellen Sie sicher, dass Sie über die Berechtigungen zum Entfernen der Remote-Zweige verfügen.

Ewin Hong
quelle
Dies sollte eine Top-Antwort sein, es ist plattformunabhängig.
Karmington
Was ist die Software und ist sie für Linux verfügbar?
Abhisekp
1

Github hat auch eine nette Benutzeroberfläche und einen Mechanismus zum schnellen Löschen von Zweigen, wenn Sie lieber eine Benutzeroberfläche verwenden möchten

Alex
quelle
1
Ja, es ist hier dokumentiert , aber Sie müssen immer noch einmal für jeden einzelnen Zweig klicken. Die hier am besten gewählte Lösung ist der beste Weg, um viele Zweige zu erstellen, für die Sie einen passenden regulären Ausdruck schreiben können.
Thewoolleyman
0

Ich habe versucht, alle Remote-Zweige von origin / release / r1-1 * zu löschen, daher hat das Befolgen der Befehlszeile gut funktioniert.

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}
Atish Narlawar
quelle
0

Ich konnte awk nicht verwenden, da wir für den Namen unserer Filialen eine Schrägstrichstruktur verwenden.

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

Dadurch wird der gesamte Remote-Zweig abgerufen, nur der für einen einzelnen Benutzer abgerufen, die Zeichenfolge "origin /" entfernt und für jeden von ihnen ein Löschvorgang ausgeführt.

Patrick Desjardins
quelle
0

Probelauf:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

Remote-Zweige löschen:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

Löschen Sie nur vollständig zusammengeführte Remote-Zweige:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

Erläuterung:

sed "s/origin\///"wird origin/aus dem Filialnamen entfernt. Ohne das wegzuziehen, bekam ich:remote ref does not exist

Tobias Ernst
quelle
0

Frühere Antworten haben mir geholfen, alle Release-Zweige von 2018 zu entfernen. Ich habe dies an meiner Windows 10-Eingabeaufforderung ausgeführt. Ich habe clink installiert , daher funktionieren Linux-ähnliche Befehle für mich.

Probelauf:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

Wenn der Trockenlauf Zweige anzeigt, die sich nicht in der Ferne befinden. Führen Sie den folgenden Befehl git prune aus, um das Problem zu beheben und erneut zu überprüfen.

git remote prune origin

Löschen Sie, sobald Sie mit dem obigen Ergebnis zufrieden sind:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

Wenn Sie sehen : error: unable to delete 'release-...2018': remote ref does not exist. Führen Sie dann den vorherigen Bereinigungsbefehl aus und versuchen Sie es erneut.

Damodar Bashyal
quelle
-4

Warnung: Dadurch werden alle Remote-Zweige gelöscht. Mit Vorsicht verwenden.

Ich denke, meine Art, entfernte Zweige zu löschen, ist die beste.

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

Warnung: Dadurch werden alle Remote-Zweige gelöscht. Mit Vorsicht verwenden.

Dmytro Gorpynenko
quelle
4
Als offensichtlicher Troll herabgestimmt. Würde löschen, wenn ich die Rechte hätte.
Jake A. Smith
Wo hast du Trolling gefunden?
Dmytro Gorpynenko
2
Dies ist nicht korrekt. Sie vermissen einige wichtige Argumente für xargs und beantworten die Frage nicht.
Rob
@ JakeA.Smith Jake, ich denke du hast gedacht, dass dieser Code den Remote-Master entfernen wird - was nicht der Fall ist, da grep -v master alles außer master findet.
Vadim Samokhin
@ Rob was ist hier falsch? Die endgültig ausgeführte Anweisung lautet smth wie git push: some_branch: another_branch, was absolut korrekt ist.
Vadim Samokhin