git remote prune - zeigte nicht so viele beschnittene Zweige wie ich erwartet hatte

113

Von der Manpage:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Also habe ich ein paar Zweige mit entfernt

git push origin :staleStuff

und rannte dann

git remote prune origin

Es wurde jedoch nur ein einziger lokaler Zweig beschnitten. Einige dieser Zweige wurden von mir gegründet, andere von Mitarbeitern. Bedeutet dies, dass ich diese Zweige überhaupt nicht richtig verfolgt habe?

Felixyz
quelle
7
Um herauszufinden, welche Zweige entfernt werden sollen, können Sie git remote show originnach Zweigen suchen, die markiert sindstale
Jemand irgendwo

Antworten:

189

Wenn Sie verwenden git push origin :staleStuff, wird es automatisch entfernt origin/staleStuff. Wenn Sie also ausgeführt haben git remote prune origin, haben Sie einen Zweig beschnitten, der von einer anderen Person entfernt wurde. Es ist wahrscheinlicher, dass Ihre Mitarbeiter jetzt rennen müssen git prune, um entfernte Zweige loszuwerden.


Was genau git remote prunemacht das? Hauptidee: Lokale Zweige (keine Verfolgungszweige) werden nicht vom git remote pruneBefehl berührt und sollten manuell entfernt werden.

Ein Beispiel aus der Praxis zum besseren Verständnis:

Sie haben ein Remote-Repository mit 2 Zweigen: masterund feature. Nehmen wir an, Sie arbeiten an beiden Zweigen, sodass Sie diese Referenzen in Ihrem lokalen Repository haben (vollständige Referenznamen werden angegeben, um Verwechslungen zu vermeiden):

  • refs/heads/master(Kurzname master)
  • refs/heads/feature(Kurzname feature)
  • refs/remotes/origin/master(Kurzname origin/master)
  • refs/remotes/origin/feature(Kurzname origin/feature)

Nun ein typisches Szenario:

  1. Einige andere Entwickler beenden alle Arbeiten an dem feature, führen es in masterdas featureRemote-Repository ein und entfernen es .
  2. Wenn Sie dies tun git fetch(oder git pull), werden standardmäßig keine Referenzen aus Ihrem lokalen Repository entfernt, sodass Sie immer noch über alle 4 Referenzen verfügen.
  3. Sie beschließen, sie aufzuräumen und zu rennen git remote prune origin.
  4. git erkennt, dass der featureZweig nicht mehr existiert, ebenso refs/remotes/origin/featurewie ein veralteter Zweig, der entfernt werden sollte.
  5. Jetzt haben Sie 3 Referenzen, einschließlich refs/heads/feature, weil git remote prunekeine refs/heads/*Referenzen entfernt werden.

Es ist möglich, lokale Zweige, die mit Fernverfolgungszweigen verknüpft sind, anhand von branch.<branch_name>.mergeKonfigurationsparametern zu identifizieren . Dieser Parameter ist nicht wirklich erforderlich, damit etwas funktioniert (wahrscheinlich außer git pull), daher fehlt er möglicherweise.

(aktualisiert mit Beispiel & nützlichen Informationen aus Kommentaren)

max
quelle
Ich habe die Situation so verstanden: Die Filialen sind immer noch lokal vorhanden, aber aus dem Remote-Repo entfernt. Jetzt möchte ich alle lokalen Zweige entfernen, die auf der Fernbedienung nicht vorhanden sind, daher führe ich git prune aus. Das sagt mir "Diese veralteten Zweige wurden bereits aus dem Remote-Repository entfernt". Liege ich falsch?
Felixyz
3
Sie haben Recht, aber Sie haben möglicherweise die Bedeutung von "lokalen Niederlassungen" im Fall von falsch verstanden git prune. Nur Zweige in /refs/remotes/<remote_name>/werden beschnitten. Zweige in /refs/heads/werden nicht berührt - Sie müssen diese manuell verwalten.
Max
Aha, das habe ich mir gedacht. Es gibt also keine Möglichkeit, das zu tun, was ich möchte: Alle Zweige in Köpfen, die entfernte Zweige verfolgen, automatisch löschen, indem überprüft wird, ob diese entfernten Zweige gelöscht wurden?
Felixyz
2
Es gibt keinen eingebauten Befehl dafür, aber Sie können ein solches Skript selbst schreiben. Tracking-Zweige können durch das Vorhandensein von branch.<branch_name>.mergeKonfigurationsparametern identifiziert werden.
Max
Diese Antwort wäre besser, wenn Sie die Informationen in den Kommentaren in die Antwort selbst einfügen würden, damit jeder, der hierher kommt und das gleiche Missverständnis wie @Felixyz hat, Ihre Antwort nicht lustig ansehen und dann die Kommentare lesen muss, um endlich Verständnis zu erlangen .
Akrikos