Git löschen Fernbedienungen: Remote-Refs existieren nicht

107

Zusamenfassend;

  • Wie kann ich mehrere zusammengeführte Remote-Fernbedienungen löschen?

Mehr Hintergrund;

Ich habe ein Git-Repo mit Dutzenden von Fernbedienungen, die zu Master zusammengeführt wurden. Ich kann diese Fernbedienungen einzeln löschen, indem ich Folgendes verwende:

git push --delete origin myBranch-1234

Dies ist jedoch ein langsamer und langwieriger Prozess für alle Fernbedienungen. Also versuche ich diesen Befehl:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedlistet alle zusammengeführten Fernbedienungen auf.
grep originWeist den Befehl an, den Ursprung einzuschließen.
grep -v masterWeist den Befehl an, den Master auszuschließen.
xargs git push origin --deleteWeist den Befehl an, die Liste der Fernbedienungen zu löschen.

Alles in allem erwarte ich, dass alle zusammengeführten Fernbedienungen gesammelt und gelöscht werden.

Wenn ich den obigen Befehl ausführe, erhalte ich für jede zusammengeführte Fernbedienung Folgendes:

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

Diese Fernbedienungen existieren jedoch und ich kann jede von ihnen auschecken. Viele Websites und Leute empfehlen, dass ich laufe git fetch --prune, um fehlende Referenzen zu bereinigen. Dies führt zu nichts, da alle diese Fernbedienungen vorhanden sind.

Also frage ich dich, lieber Stapeltausch;

  • Warum kann ich eine Fernbedienung löschen, aber nicht viele?
  • Ist mein Befehl korrekt?

Ich glaube, ich vermisse etwas Kleines. Jedes Mal, wenn ich dies recherchiere, scheint es, als würde ich das richtig machen, aber ich erhalte die oben genannten Fehler.

Jqw
quelle

Antworten:

226

Möglicherweise müssen Sie zuerst Ihren lokalen "Cache" für Remote-Zweige bereinigen. Versuchen Sie zu laufen:

git fetch -p origin

vor dem Löschen.

Igor
quelle
2
Das hat es für mich gelöst, danke! Warum wird es jedoch nicht aktualisiert, wenn ich ohne abrufe --prune? Meiner Meinung nach ist das ziemlich irreführend
dave0688
6
Nur eine Notiz für Leute, die von einer Suche hierher kommen - obwohl dies für die Mehrheit, die hier landet, eindeutig nützlich ist, ist es in Bezug auf das ursprüngliche Problem nicht wirklich korrekt -, bestand das Problem des OP darin, dass sein Befehl origin/wie beschrieben falsch in den Filialnamen enthalten war / in anderen Antworten gelöst.
CupawnTae
104

Werden diese Zweige von der Fernbedienung (Ursprung) entfernt? Wenn ja, können Sie einfach tun

git fetch --prune origin

Andernfalls werden sie möglicherweise auch dann zurückgegeben, wenn Sie sie lokal löschen.

Update: Wenn Sie Ihren Befehl erneut betrachten, sieht es so aus, als würden Sie ihn falsch erstellen. Sie wollen wahrscheinlich

git push origin --delete myBranch-1234

aber stattdessen machst du so etwas

git push origin --delete origin/myBranch-1234
Mykola Gurov
quelle
Keiner der Zweige wird im Ursprung entfernt. Ich kann jeden von ihnen auschecken.
Jqw
1
ja, weil Sie im zweiten Fall verschiedene Befehle ausführen.
Mykola Gurov
1
Ich verstehe deinen Standpunkt nicht. Ich weiß, dass ich zwei verschiedene Befehle verwende. Der zweite Fall besteht darin, alle zusammengeführten Fernbedienungen mit zu erhalten, git branch -r --mergedund dann versuche ich, sie mit zu löschen xargs git push origin --delete. Der Befehl versucht, die Fernbedienungen zu löschen, außer dass er denkt, dass remote ref does not exist.
Jqw
1
Setzen Sie in Ihrem zweiten Pipe-Befehl das Echo direkt neben, um xargszu sehen, was tatsächlich ausgeführt wird.
Mykola Gurov
2
@Jqw Sie können das origin/Präfix nicht in den Zweignamen einfügen. Git weiß bereits, dass Sie mit den Zweigen des Ursprungs arbeiten, seit Sie ausgeführt werden git push origin. Mykolas Vorschlag war, den letzten Teil des Befehls zu machen xargs echo, anstatt echo xargs [...].
Matthew Read
15

Verwenden Sie seddiese Option, um 'origin /' Teil zu entfernen und eine lttile zu ändernxargs Teil zu .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
kost
quelle