Entfernen Sie alte Remote-Zweige von Git

80

Wenn ich die Bash-Autovervollständigung in Git verwende, werden mir immer wieder Zweige alter Fernbedienungen angezeigt, die ich nicht mehr habe. Wenn ich ein mache git branch -la, zeigt es diese alten Fernbedienungen und Zweige, während ein git branch -lnicht. A ls .git/refs/remotes/zeigt sie auch. Sie sind jedoch in meiner .git / config nicht vorhanden und werden beim Ausführen auch nicht angezeigt git remote show.

Wie kann ich sie entfernen, weil meine Autovervollständigungsliste momentan zu lang ist?

Ich habe es bereits versucht:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Mir ist auch bewusst, dass ich das Repo einfach neu klonen kann, aber das ist nur Betrug ;-)

Alex
quelle
Hinweis: a git remote rmnow (git 2.0.1, Juni 2014) löscht zuerst die Remote-Tracking-Zweige. Das soll helfen, alte Äste nicht aufzuräumen. Siehe meine Antwort unten
VonC
Hier ist meine andere Antwort: stackoverflow.com/a/44129766/3835843
Arif

Antworten:

141

Git löscht die (lokalen) Remote-Tracking-Zweige nicht automatisch, wenn der Zweig im Remote-Repository gelöscht wurde. Darüber hinaus wurden in V2.0.1 Remote-Tracking-Zweige in einigen Fällen nicht gelöscht, als Sie die Remote aus Ihrer Git-Konfiguration entfernt haben (siehe VonCs Antwort).

Führen Sie Folgendes aus, um veraltete Remote-Tracking-Zweige (Zweige, die im Remote-Repository gelöscht wurden) für eines Ihrer Remote-Repositorys zu löschen

git remote prune <remote>

So zitieren Sie die Manpage oder git remote:

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.

Aus Ihrer Frage geht jedoch hervor, dass Sie manuell entfernt wurden .git/refs/remotes/theoldremote, sodass Git nicht mehr über das Remote-Repository Bescheid weiß, zu dem die Remote-Tracking-Zweige gehörten. So sollst du es nicht machen.

Der normale Weg, ein Remote-Repository zu entfernen, ist die Ausführung

git remote rm <remote>

Dadurch wird die Fernbedienung von Ihrem entfernt .git/configund die Fernverfolgungszweige gelöscht.

Wenn Sie nur das Verzeichnis unter löschen .git/refs/remotes/, bleiben die Zweige zurück. Dann müssen Sie sie manuell entfernen:

git branch -rd <remote>/<branchname>

Sie benötigen eine Option -rzum Löschen eines Remote-Zweigs.

sleske
quelle
2
Nein, das ist es nicht. Es heißt fatal: 'kolichikov' does not appear to be a git repository.
Alex
2
Informationen zum automatischen Beschneiden entfernter Zweige beim Abrufen / Ziehen finden Sie auch unter: stackoverflow.com/a/18718936/968201
Patrick James McDougle
Wenn Sie dies langsam finden, aktualisieren Sie auf das neuere Git (2.0.1+ IIRC), wo dies behoben ist (über 100x schneller).
Odinho - Velmont
Hinweis für Benutzer zum Bereinigen: In der Git-Dokumentation heißt es: " In den meisten Fällen sollten Benutzer ausgeführt werden git gc, wodurch git prune aufgerufen wird. " Beachten Sie jedoch, dass dies git gcnicht kompatibel ist mit --dry-run.
JYL
git branch -rd <remote>/<branchname>war das, wonach ich gesucht habe. Vielen Dank!
Antoine Colson
16

ich benutze

git push origin :remote_branch

um einen Zweig vom Server zu entfernen.

git remote prune origin

Remote-Referenzen entfernen, die auf dem Server nicht mehr vorhanden sind

Mert
quelle
Nein, das ist es nicht. Es heißtfatal: 'kolichikov' does not appear to be a git repository
Alex
1
Alex, du musst den Befehl im Repository-Ordner ausführen, der sich nicht in deinem Home-Ordner befindet ...
SparK
6

Hinweis: Während git remote prune die Antwort ist, sollten Sie wissen, dass a ab git 2.0.1 (25. Juni 2014) zunächst git remote rm die Remote-Tracking-Zweige entfernt .
Hoffentlich sollte man alte Äste nach einem nicht mehr aufräumen müssen git remote rm.

Siehe Commit b07bdd3 von Jens Lindström ( jensl)

remote rm: Remote-Konfiguration als letzte löschen

Löschen Sie beim Entfernen einer Fernbedienung die Fernverfolgungszweige, bevor Sie die Fernkonfiguration löschen.
Auf diese Weise kann der Befehl erneut ausgeführt werden, wenn der Vorgang fehlschlägt oder beim Löschen der Fernverfolgungszweige abgebrochen wird, um den Vorgang abzuschließen .


Aber wenn Sie müssen, kann ein einfaches git fetchausreichen, vorausgesetzt, Sie haben zuerst festgelegt:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true
VonC
quelle
4

Schieben Sie nichts in einen Zweig, um ihn zu löschen:

git push remote :remote_branch

Es ist irgendwo in der Dokumentation, aber es ist nicht wirklich offensichtlich.

Oder habe ich Ihre Frage falsch verstanden?

Aragaer
quelle
2
"Es ist irgendwo in der Dokumentation, aber es ist nicht wirklich offensichtlich." so istgit
mnagel
Mit "remote" meinte ich den Namen Ihres Remote-Repositorys. Wie "Herkunft" oder was auch immer. Aber ich fange an zu denken, dass Sie etwas anderes gemeint haben, als nur den Remote-Zweig zu löschen.
Aragaer
Etwas anderes wie dieses: stackoverflow.com/questions/1072171/…
aragaer
4

Ok, ich habe es verstanden. Das Problem war, dass die Fernbedienungen nicht mehr existieren, aber irgendwo in der Git-Datenbank. Ich fügte die Fernbedienungen wieder hinzu und tat es dann

git remote prune theremote
git remote rm theremote
git gc --prune=now

Danach verschwinden sie von der Liste. Irgendwie habe ich sie nicht richtig entfernt, bevor ich denke.

Alex
quelle
Ich habe alles aus einer Reihe von Quellen ausprobiert, und das einzige, was funktioniert hat, war, das Problem remote erneut hinzuzufügen und es dann zu entfernen. Vielen Dank!
JC00KE
0

Ich war verwirrt, als auf der Serverseite gelöschte Remote-Zweige beim Ausführen immer noch angezeigt wurden:

$ git branch --all

Der folgende Befehl hat dies für mich behoben (auf Git-Version 2.25.0):

$ git remote update --prune
htaccess
quelle