Wie entferne ich eine ungültige Remote-Verzweigungsreferenz von Git?

731

In meinem aktuellen Repo habe ich folgende Ausgabe:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Ich möchte remotes/public/masteraus der Branchenliste löschen :

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Auch die Ausgabe von git remoteist seltsam, da sie nicht auflistet public:

$ git remote show 
origin

Wie kann ich 'remotes / public / master' aus der Filialliste löschen?

Update, versuchte den git pushBefehl:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
quelle
31
Hat in Ihrem Szenario funktioniert git remote prune [remote-name]oder git fetch -p [remote-name]nicht? Dies zu tun git gcist viel kraftvoller als normalerweise erforderlich.
rjmunro
6
git remote prune [remote-name]wird nicht funktionieren mit git svn, obwohl auch nicht git gc... git branch -rd origin/namefunktioniert aber. @Casey, du solltest wahrscheinlich die zweite Antwort auswählen - es ist etwas weniger gefährlich.
naught101
4
Ich liebe diese Frage.
Ich
Verwandte, wenn nicht ein betrogenes Ziel: Löschen Sie einen Git-Zweig sowohl lokal als auch remote .
2
Um künftig einen n00b-Gitter-Fehler zu vermeiden, empfehle ich die Verwendung eines anderen Beispielzweigs als master..., insbesondere beim Löschen auf der Fernbedienung.
Abwesenheit

Antworten:

743

Möglicherweise benötigen Sie eine Bereinigung:

git gc --prune=now

oder Sie benötigen möglicherweise eine Pflaume:

git remote prune public

Pflaume

Löscht alle veralteten Verfolgungszweige unter <Name>. Diese veralteten Zweige wurden bereits aus dem Remote-Repository entfernt, auf das mit <Name> verwiesen wird, sind jedoch weiterhin lokal in "Remotes / <Name>" verfügbar.

Geben Sie mit der Option --dry-run an, welche Zweige beschnitten werden sollen, beschneiden Sie sie jedoch nicht.

Es scheint jedoch, dass diese früher mit bereinigt worden sein sollten

git remote rm public 

rm

Entfernen Sie die Fernbedienung mit dem Namen <Name>. Alle Fernverfolgungszweige und Konfigurationseinstellungen für die Fernbedienung werden entfernt.

Möglicherweise haben Sie Ihre Konfigurationsdatei von Hand bearbeitet und dies ist nicht aufgetreten, oder Sie haben Probleme mit Berechtigungen.

Führen Sie das vielleicht noch einmal durch und sehen Sie, was passiert.


Beratungskontext

Wenn Sie sich die Revisionsprotokolle ansehen , werden Sie feststellen, dass ich mehr "korrekte" Techniken vorgeschlagen habe, die aus irgendeinem Grund nicht an ihrem Repository arbeiten wollten.

Ich vermutete, dass die OP etwas getan hatte, das ihren Baum in einem inkonsistenten Zustand git gczurückließ , der dazu führte, dass er sich etwas seltsam verhielt , und dass die zurückgelassene Kruft repariert werden musste.

Normalerweise reicht git branch -rd origin/badbranch es aus, um einen lokalen Tracking-Zweig oder git push origin :badbrancheinen Remote-Zweig zu zerstören, und normalerweise müssen Sie nie anrufengit gc

Kent Fredric
quelle
4
Ich möchte den Zweig auf der Remote-Seite nicht löschen. Ich denke, es gibt einen subtilen Unterschied.
cmcginty
2
Die Frage lautet also effektiv: "Wie lösche ich einen Remote-Zweig?". Das sind diese Wege.
Kent Fredric
1
Ich werde das Thema umformulieren, wenn dies klarer macht, was ich frage, aber der Befehl zeigt genau, was mein Problem ist.
cmcginty
40
git gcwird hier nicht benötigt, aber git remote pruneich fühle mich sicherer als das manuelle Löschen von Dingen mit git branch -rd, da git überprüft, welche Remote-Zweige ausgeführt werden.
Mike Seplowitz
3
das hat bei mir nicht funktioniert - der 'git branch -rd' hat aber gut funktioniert.
dsummersl
683

Alles was Sie tun müssen, ist

git fetch -p

Es werden alle Ihre lokalen Zweige entfernt, die remote gelöscht werden.

Wenn Sie auf Git 1.8.5+ sind, können Sie dies automatisch einstellen

git config fetch.prune true

oder

git config --global fetch.prune true
Pawan Maheshwari
quelle
7
Dies ist auch das, wonach ich gesucht habe - die Frage beschreibt ein Szenario, das komplizierter ist als das übliche.
rjmunro
22
Ich suche nach einer Möglichkeit, lokale Zweige zu löschen, in denen die entsprechende Fernbedienung gelöscht wurde, aber dies funktioniert bei mir nicht. Irgendeine Idee warum?
Jackocnr
11
Dadurch werden die in remote / origin aufgelisteten Zweige entfernt, lokale Tracking-Zweige werden jedoch nicht gelöscht, was ebenso wichtig ist.
BlueRaja - Danny Pflughoeft
@Cupcake Da Sie meine erste Bearbeitung nicht zurückgesetzt haben (wodurch die falschen Informationen zu Git 1.8.5+ behoben wurden), haben Sie dies jetzt falsch gemacht. Meine zweite Bearbeitung bestand darin, zu korrigieren, was ich eingegeben habe, was falsch war, was jetzt wieder da ist (mit Ihrem Rollback). Bitte fahren Sie fort und rollen Sie eine weitere Bearbeitung zurück, um das Original zu erhalten. Vielen Dank.
Ferventcoder
@ferventcoder Ich habe Ihre letzte Bearbeitung noch einmal überprüft und darauf zurückgegriffen. Das OP kann wieder zurückgesetzt werden, wenn es ihm nicht gefällt. Vielen Dank.
319
git push public :master

Dies würde den entfernten Zweig löschen, auf den masterKent Fredric hingewiesen hat.

So listen Sie Remote-Tracking-Zweige auf:

git branch -r

So löschen Sie einen Remote-Tracking-Zweig:

git branch -rd public/master
Alan Haggai Alavi
quelle
6
Dies hat mir geholfen, einen git-svn-Remote-Ghost-Zweig zu entfernen.
Nick
9
git branch -rd removed_remote/brancharbeitete für mich, während das git gc --prune=nowwertlos war.
Rchampourlier
2
Ich konnte git pruneohne Probleme arbeiten, aber mein Kollege, der unser Haupt-Repo gabelte ** KÖNNTE NUR ** die git branch -rd public/masterLösung im Stil verwenden, um seine Umgebung aufzuräumen.
Abel
3
git branch -rd public/masterwar was mir fehlte. Ich hatte heroku/masterund herkou/master... lol woops
Aaron
@rchampourlier Nicht 100% wertlos - Wenn Ihr Git-Repo groß ist, kann das Entfernen der nicht verwendeten Zweige in einigen Situationen viel Speicherplatz freigeben.
Peter - Wiedereinsetzung Monica
159

Alles was Sie tun müssen, ist

$ git branch -rd origin/whatever 

So einfach ist das. Es gibt keinen Grund, hier einen GC anzurufen.

jpswain
quelle
1
Wie "pushen" Sie das Löschen auf Github?
Thufir
14
@Thufir Darum ging es in dieser Frage nicht. Diese Frage wurde speziell für Situationen gestellt, in denen Sie eine ungültige Remote-Referenz im lokalen Repo haben, diese Verzweigung jedoch nicht mehr auf dem Remote-Server vorhanden ist. Die Antwort auf Ihre Frage lautet $ git push origin: was auch immer
jpswain
Ja, wenn auf dem Remote-Repo etwas passiert, auf dem ein Zweig gelöscht wird, Sie aber immer noch auf diesen Remote-Zweig auf Ihrem lokalen Computer verweisen, müssen Sie das tun, was ich in meine ursprüngliche Antwort eingegeben habe, um ihn zu bereinigen.
Jpswain
6
Wenn Sie einen großen Bereinigungsjob haben (viele baumelnde Fernbedienungen), können Sie einfach alle Remote-Zweige mit so etwas wie löschen und git branch -rd $(git branch -r)dann die gültigen Zweige durch einen Abruf wiederherstellen.
Nobar
Meine Situation war, dass ich git config -emeine Fernbedienung umbenannt hatte. Ich habe die Fernbedienung minein umbenannt origin. Dann war dies die Lösung, die für mich am besten funktionierte:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu
70

git gc --prune=now ist nicht was du willst.

git remote prune public

oder git remote prune origin#, wenn dies die Remote-Quelle ist

ist was du willst

Tongueroo
quelle
6
@Casey $ git gc # mag eine Defragmentierung für die Git-Dateien, um das Respository zu beschleunigen. $ Git-Remote-Prune-Ursprung # bereinigt das Löschen der veralteten Remote-Zweige, die mit "git branch -r | grep origin" angezeigt werden. Das ist, was die Frage stellt, glaube ich. Die Befehle sind also völlig unterschiedlich.
Tongueroo
29

Die akzeptierte Antwort funktionierte bei mir nicht, als der Schiedsrichter gepackt war. Dies tut jedoch:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
chris
quelle
Hat für mich gearbeitet. Der reguläre Git-Zweig -d funktionierte nicht. Es wurde der Fehler zurückgegeben, dass der Zweig nicht vorhanden ist, da ich den versehentlich erstellten Ursprung "original" direkt in der .git / config-Datei entfernt habe.
Micrub
Dies ist die Methode, mit der ich Zweige entfernen musste, die versehentlich in meiner .git / config weggelassen wurden (die aufgrund einer nicht verwandten Beschädigung neu erstellt werden musste). Es ist schade, dass diese Antwort so weit unten in der Kette war, dass ich sie erst bemerkte, als ich endlich die Lösung fand und sie der akzeptierten Antwort hinzufügte!
Taranaki
Dies ist, was ich nach der Verwendung von svn2git brauchte. Es gab viele Fernbedienungen / svn / * Zweige. Musste zuerst eine gefälschte 'svn' Fernbedienung erstellen.
Sam
7

In meinem Fall habe ich versucht, Einträge zu löschen, die in gespeichert wurden .git/packed-refs. Sie können diese Nur-Text-Datei bearbeiten und Einträge daraus löschengit br -D die nicht zu berühren wissen (zumindest in Version 1.7.9.5).

Ich habe diese Lösung hier gefunden: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
quelle
Wow, das hat mir geholfen. Mein Kollege hat versucht, VS neu zu starten, seinen Computer neu zu starten, nichts hat funktioniert, er hat sein lokales Repo gelöscht und alles gezogen, um dies loszuwerden :)
Esen
1
Heute habe ich festgestellt, dass diese gepackte Referenzdatei als Teil von erstellt git gcwird. Wenn Ihre Commits in ein stark komprimiertes Archiv gepackt werden, werden die Verweise auch in eine einzelne Nur-Text-Datei verschoben, möglicherweise zu Optimierungszwecken. Ich hoffe, dass zukünftige Versionen von Git git br -D ...Refs verpacken können .
ThorSummoner
3

Ich wusste nichts davon. Daher habe git branch -rdich Probleme wie dieses für mich gelöst, indem ich mein Repo als Remote-Repo behandelte und ein Remote-Löschen durchführte. git push . :refs/remotes/public/master. Wenn die anderen Wege nicht funktionieren und Sie eine seltsame Referenz haben, die Sie loswerden möchten, ist dieser rohe Weg todsicher. Es gibt Ihnen die genaue Genauigkeit, um jede Art von Referenz zu entfernen (oder zu erstellen!).

klackern
quelle
2

Nur geringfügig verwandt, aber möglicherweise in der gleichen Situation wie bisher hilfreich - wir verwenden eine Netzwerkdateifreigabe für unser Remote-Repository. Letzte Woche haben die Dinge funktioniert, diese Woche wurde der Fehler "Remote-Ursprung hat Ref nicht für Zweigstellenreferenzen / Köpfe / Master angekündigt. Diese Referenz ist möglicherweise nicht in der Fernbedienung vorhanden oder wird möglicherweise durch Berechtigungseinstellungen ausgeblendet."

Aber wir glaubten, dass nichts getan worden war, um Dinge zu korrumpieren. Das NFS erstellt Snapshots, daher habe ich jede "vorherige Version" überprüft und festgestellt, dass vor drei Tagen die Größe des Repositorys in MB von 282 MB auf 33 MB gestiegen ist und jetzt etwa 1.403 neue Dateien und 300 Ordner vorhanden sind. Ich habe meine Mitarbeiter befragt und einer hatte an diesem Tag versucht, einen Push zu machen - und ihn dann abgesagt.

Ich habe die NFS-Funktion "Wiederherstellen" verwendet, um sie kurz vor diesem Datum wiederherzustellen, und jetzt funktioniert alles wieder einwandfrei. Ich habe die Pflaume vorher probiert, schien nicht zu helfen. Vielleicht hätten die härteren Aufräumarbeiten funktioniert.

Hoffe, das könnte eines Tages jemand anderem helfen!

Jay

JGlass
quelle
2

Ich hatte ein ähnliches Problem. Keine der Antworten half. In meinem Fall wurden zwei entfernte Remote-Repositorys permanent angezeigt.

Meine letzte Idee war, alle Verweise von Hand zu entfernen.

Angenommen, das Repository heißt "Repo". Ich tat:

find .git -name Repo 

Daher habe ich die entsprechenden Dateien und Verzeichnisse aus dem Ordner .git gelöscht ( dieser Ordner befindet sich in Ihrer Rails-App oder auf Ihrem Computer unter https://stackoverflow.com/a/19538763/6638513) ).

Dann habe ich:

grep Repo -r .git

Dabei wurden einige Textdateien gefunden, in denen ich die entsprechenden Zeilen entfernt habe. Jetzt scheint alles in Ordnung zu sein.

Normalerweise sollten Sie diesen Job dem Git überlassen.

Keinstein
quelle