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?
128
$ 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'
git branch -r | awk -F/ '/\/APR/{print $2}'
könnte sehen Sie alle der APR Präfix Zweig Namen aufgelistet?APR-04-DPH
Zweig 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.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Wenn Sie einen einfacheren Ansatz bevorzugen, löschen Sie beispielsweise 3 oder 4 Zweige:
Wichtig: Funktioniert nur mit Git v1.7.0 und höher.
quelle
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
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
awk
Feldtrennzeichens/
(-F
Option)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 hatorigin
. Befehl zum Löschen entfernter Zweige mit Namen, die auf Folgendes starrenPATTERN
:Und vergessen Sie nicht zu überprüfen, was Sie löschen werden:
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:quelle
xargs -a file -L
anstelle voncat file | xargs
. Noch einfacherxargs -a file git push --delete origin
.Dies mag eine doppelte Antwort sein, aber unten getestet und für mich perfekt funktioniert.
Git Branch -D Backticks $ (Git Branch - List 'Feature / *' Backticks )
quelle
Das gleiche gilt für grep :
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
zeigtorigin/prefix/branchname
. Also wird es dauernprefix/branchname
.quelle
xargs -I {} git push origin :{}
nicht-i
.-i
es den Standardersatz für verwendet,{}
aber mit-I
Ihnen können Sie Ihren eigenen deklarieren. ... gerade im Handbuch gefunden:-i ... the same as -I{}
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:
Endgültige Lösung, um die Löschvorgänge tatsächlich zu verschieben:
quelle
xargs: replstr may not be empty
mit Neeveks Lösung, vielleicht eine Git-Version.git version 1.9.5
Aber das hat bei mir großartig funktioniert. Vielen Dank an euch beideRessource https://coderwall.com/p/eis0ba
quelle
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-name
also habe ich Ihre gekürztawk
:Es macht jetzt einen schönen kleinen Löschfluss:
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):
Dies würde zu einer schönen Einzelausgabe mit einer Netzwerkanforderung führen:
quelle
Danke an Neevek. Dies funktionierte gut, nachdem ich es für meinen Zweck neu konfiguriert hatte:
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.
quelle
Jeder benutzt
awk
, nicht sicher warum. Ich denke, das ist komplexer. Folgendes lösche ich, um alle Remote-Zweige auf meinerfork
Remote zu löschen :Geben Sie
grep
zwischenxargs
und ein,sed
wenn Sie die Liste nur auf eine Teilmenge der Remote-Zweige filtern müssen.quelle
origin/blaprefix_anotherbla
. Aber mit gut damitsed
umgegangen. 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.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
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.
quelle
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
quelle
Ich habe versucht, alle Remote-Zweige von origin / release / r1-1 * zu löschen, daher hat das Befolgen der Befehlszeile gut funktioniert.
quelle
Ich konnte awk nicht verwenden, da wir für den Namen unserer Filialen eine Schrägstrichstruktur verwenden.
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.
quelle
Probelauf:
Remote-Zweige löschen:
Löschen Sie nur vollständig zusammengeführte Remote-Zweige:
Erläuterung:
sed "s/origin\///"
wirdorigin/
aus dem Filialnamen entfernt. Ohne das wegzuziehen, bekam ich:remote ref does not exist
quelle
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:
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.
Löschen Sie, sobald Sie mit dem obigen Ergebnis zufrieden sind:
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.quelle
Warnung: Dadurch werden alle Remote-Zweige gelöscht. Mit Vorsicht verwenden.
Ich denke, meine Art, entfernte Zweige zu löschen, ist die beste.
Warnung: Dadurch werden alle Remote-Zweige gelöscht. Mit Vorsicht verwenden.
quelle