Was sind die Unterschiede zwischen git remote prune, git prune, git fetch –prune usw

Lesezeit: 6 Minuten

Was sind die Unterschiede zwischen git remote prune git prune
gogogadgetinternet

Meine Situation ist folgende … jemand, der am selben Repo arbeitet, hat einen Zweig aus seinem lokalen und Remote-Repo gelöscht …

Die meisten Leute, die nach dieser Art von Problem auf Stack Overflow oder anderen Websites gefragt haben, haben das Problem, dass Branches immer noch in ihrer Remote-Tracking-Branchenliste angezeigt werden git branch -a unten:

* master
  develop
  feature_blah
  remotes/origin/master
  remotes/origin/develop
  remotes/origin/feature_blah
  remotes/origin/random_branch_I_want_deleted

In MEINER Situation ist der Zweig, der nicht da sein sollte, jedoch lokal:

* master
  develop
  feature_blah
  random_branch_I_want_deleted
  remotes/origin/master
  remotes/origin/develop
  remotes/origin/feature_blah

Wenn ich eine der folgenden Aktionen ausführe, wird sie nicht lokal entfernt:

$ git prune

Ich habe auch versucht:

$ git remote prune origin
$ git fetch --prune

Weitere nützliche Informationen: Wenn ich nachschaue git remote show origin so sieht es aus:

* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push  URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
 master                        tracked
 develop                       tracked
 feature_blah                  tracked
 other123                      tracked
 other444                      tracked
 other999                      tracked
Local branches configured for 'git pull':
 develop                      merges with remote develop
 feature_blah                 merges with remote other999
 master                       merges with remote master
 random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
 develop         pushes to develop     (local out of date)
 master          pushes to master      (up to date)
 feature_blah    pushes to feature_blah(up to date)

Beachten Sie, dass es nur in dem Abschnitt mit dem Titel ist Local branches configured for 'git pull':

Warum?

  • Danke, aber ich bin nur neugierig, warum es passiert sein könnte.

    – gogogadgetinternet

    20. November 2013 um 21:08 Uhr

  • Beim Umgang mit der Zweighierarchie gab es einen feinen Unterschied (x/y): Es wurde behoben (siehe meine Antwort unten)

    – VonC

    12. Januar 2014 um 8:57 Uhr

Was sind die Unterschiede zwischen git remote prune git prune
John Szakmeister

Ich mache dir keinen Vorwurf, dass du darüber frustriert bist. Der beste Weg, um zu sehen, ist dies. Es gibt möglicherweise drei Versionen von jedem Remote-Zweig:

  1. Der eigentliche Zweig im Remote-Repository
    (z. B. Remote-Repo unter https://example.com/repo.git, refs/heads/master)
  2. Ihre Momentaufnahme dieses Zweigs lokal (gespeichert unter refs/remotes/...)
    (z. B. lokales Repo, refs/remotes/origin/master)
  3. Und eine lokale Verzweigung, die möglicherweise die entfernte Verzweigung verfolgt
    (z. B. lokales Repo, refs/heads/master)

Lass uns beginnen mit git prune. Dies entfernt Objekte die nicht mehr referenziert werden, entfernt es keine Referenzen. In Ihrem Fall haben Sie eine lokale Niederlassung. Das heißt, es gibt einen Schiedsrichter namens random_branch_I_want_deleted das bezieht sich auf einige Objekte, die die Geschichte dieses Zweigs darstellen. Also per definitionem git prune wird nicht entfernt random_branch_I_want_deleted. Wirklich, git prune ist eine Möglichkeit, Daten zu löschen, die sich in Git angesammelt haben, aber von nichts referenziert werden. Im Allgemeinen wirkt sich dies nicht auf Ihre Ansicht von Zweigen aus.

git remote prune origin und git fetch --prune beide arbeiten auf Referenzen unter refs/remotes/... (Ich werde diese als Remote-Referenzen bezeichnen). Lokale Niederlassungen sind davon nicht betroffen. Die git remote Version ist nützlich, wenn Sie nur Remote-Referenzen unter einer bestimmten Fernbedienung entfernen möchten. Ansonsten machen die beiden genau das gleiche. Also, kurz gesagt, git remote prune und git fetch --prune Arbeiten Sie mit Nummer 2 oben. Wenn Sie beispielsweise einen Branch mit der Git-Web-GUI gelöscht haben und nicht mehr in Ihrer lokalen Branch-Liste angezeigt werden möchten (git branch -r), dann ist dies der Befehl, den Sie verwenden sollten.

Um einen lokalen Zweig zu entfernen, sollten Sie verwenden git branch -d (oder -D wenn es nirgendwo zusammengeführt wird). FWIW, es gibt keinen Git-Befehl zum automatischen Entfernen der lokalen Tracking-Zweige, wenn ein Remote-Zweig verschwindet.

  • Dadurch kann die Gesamtfrage besser beantwortet werden, indem die relevanten Unterschiede erläutert werden. Es beantwortet auch zusätzliche Fragen, die ich von der obigen hatte.

    – gogogadgetinternet

    20. November 2013 um 21:26 Uhr

  • Dieser Befehl zeigt eine Liste aller lokalen Zweige, die keinen entsprechenden Remote-Zweig haben. Sie könnten leiten Sie dies zu xargs git branch -Daber beachten Sie, dass alle neuen Zweige, die Sie erstellt, aber nie auf den Server gepusht haben, gelöscht würden, gehen Sie also vorsichtig vor: git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'

    – Jason Walton

    11. September 2014 um 2:59 Uhr


  • @Seed Nein, tut es nicht. 🙁 Es löscht nur die lokalen Remote-Tracking-Referenzen. Ich habe dies gerade mit Version 2.7.0 überprüft.

    – John Szakmeister

    9. Mai 2016 um 19:29 Uhr

  • @BlueRaja-DannyPflughoeft Seien Sie vorsichtig mit diesem Ansatz. Je nachdem, wie Sie Ihre Stable-Zweige machen, scheinen sie beispielsweise mit dem Master-Zweig zusammengeführt zu sein, und Sie würden sie am Ende entfernen. Es ist hier kein großer Verlust, da Sie sie nicht vom Server entfernen, aber wenn Sie eine spezielle Konfiguration dafür festgelegt hätten, würde diese verloren gehen, wenn der Zweig gelöscht wird.

    – John Szakmeister

    7. März 2017 um 13:34 Uhr

  • @Cloud Nicht ganz richtig. Referenzen können gepackt werden (siehe die packed-refs Datei in der .git Bereich), es ist also nicht unbedingt einfach, sie über den Datei-Explorer zu löschen. Verwenden Sie besser die Befehle, um sicherzustellen, dass beide korrekt behandelt werden.

    – John Szakmeister

    30. April 2019 um 20:40 Uhr

Was sind die Unterschiede zwischen git remote prune git prune
KarlB

git remote prune und git fetch --prune Machen Sie dasselbe: Löschen Sie die Verweise auf die Zweige, die auf der Fernbedienung nicht vorhanden sind, wie Sie gesagt haben. Der zweite Befehl stellt eine Verbindung zur Fernbedienung her und ruft ihre aktuellen Zweige vor dem Pruning ab.

Es berührt jedoch nicht die von Ihnen ausgecheckten lokalen Filialen, die Sie einfach mit löschen können

git branch -d  random_branch_I_want_deleted

Ersetzen -d durch -D wenn die Filiale nicht anderweitig zusammengeführt wird

git prune macht etwas anderes, es löscht unerreichbare Objekte, jene Commits, die in keinem Zweig oder Tag erreichbar sind und daher nicht mehr benötigt werden.

  • Ich weiß, es scheint offensichtlich, aber git prune sucht nicht nur nach Branches und Tags, sondern auch nach allen anderen Refs.

    Benutzer743382

    20. November 2013 um 21:08 Uhr

  • Warum sollte Git Prune in meinem Fall nicht funktionieren? Weil es nicht um lokale Branches geht, sondern um Remote-Referenzen? Danke für die knappe Info.

    – gogogadgetinternet

    20. November 2013 um 21:12 Uhr

  • @hvd welche Art von Refs gibt es außer Branches und Tags?

    – KarlB

    20. November 2013 um 21:12 Uhr

  • @gogogadgetinternet ja genau. (vorausgesetzt du meintest git remote prune)

    – KarlB

    20. November 2013 um 21:13 Uhr

  • IMO die Git-Namenskonvention, “prune” für beide Objektsammlungen zu verwenden und Bei der Referenzbereinigung beginnt die Verwirrung. Aber das ist nur eines von vielen UI-Rätseln in git. 🙂

    – Torek

    20. November 2013 um 21:37 Uhr

1646362089 208 Was sind die Unterschiede zwischen git remote prune git prune
Pomme.Verte

Falls es jemanden interessiert. Hier ist ein schnelles Shell-Skript, das alle lokalen Branches entfernt, die nicht remote verfolgt werden. Ein Wort der Vorsicht: Dadurch werden alle Zweige entfernt, die nicht aus der Ferne verfolgt werden, unabhängig davon, ob sie zusammengeführt wurden oder nicht.

Wenn ihr irgendwelche Probleme damit seht, lasst es mich bitte wissen und ich werde es beheben (usw. etc.)

Speichern Sie es in einer Datei namens git-rm-ntb (nennen Sie es wie auch immer) an PATH und Renn:

git-rm-ntb <remote1:optional> <remote2:optional> ...

clean() { REMOTES="$@";  wenn [ -z "$REMOTES" ];  dann REMOTES=$(git remote);  fi REMOTES=$(echo "$REMOTES" | xargs -n1 echo) RBRANCHES=() while read REMOTE;  do CURRBRANCHES=($(git ls-remote $REMOTE | awk '{print $2}' | grep 'refs/heads/' | sed 's:refs/heads/::')) RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHEN[@]}") fertig < <(echo "$REMOTES" )
  [[ $RBRANCHES ]]||  exit LBRANCHES=($(git branch | sed 's:\*::' | awk '{print $1}')) für i in "${LBRANCHES[@]}"; do skip= für j in "${RBRANCHES[@]}"; tun
      [[ $i == $j ]]&& { überspringen=1;  echo -e "\033[32m Keeping $i \033[0m"; break; }
    done
    [[ -n $skip ]]||  { echo -e "\033[31m $(git branch -D $i) \033[0m"; }
  done
}

clean $@

  • Wouldn't $(git branch -d $i) be safer to only delete merged branches?

    – user2012677

    May 9, 2019 at 19:42

  • The safer options are discussed in stackoverflow.com/questions/7726949/…

    – Michael Freidgeim

    May 10, 2020 at 0:44


1646362090 635 Was sind die Unterschiede zwischen git remote prune git prune
VonC

Note that one difference between git remote --prune and git fetch --prune is being fixed, with commit 10a6cc8, by Tom Miller (tmiller) (for git 1.9/2.0, Q1 2014):

When we have a remote-tracking branch named "frotz/nitfol" from a previous fetch, and the upstream now has a branch named "**frotz"**, fetch would fail to remove "frotz/nitfol" with a "git fetch --prune" from the upstream.
git would inform the user to use "git remote prune" to fix the problem.

So: when a upstream repo has a branch ("frotz") with the same name as a branch hierarchy ("frotz/xxx", a possible branch naming convention), git remote --prune was succeeding (in cleaning up the remote tracking branch from your repo), but git fetch --prune was failing.

Not anymore:

Change the way "fetch --prune" works by moving the pruning operation before the fetching operation.
This way, instead of warning the user of a conflict, it automatically fixes it.

930130cookie-checkWas sind die Unterschiede zwischen git remote prune, git prune, git fetch –prune usw

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy