git remote prune - nie pokazałem tylu przyciętych gałęzi, jak się spodziewałem

113

Ze strony podręcznika:

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>".

Więc usunąłem kilka gałęzi za pomocą

git push origin :staleStuff

a potem pobiegł

git remote prune origin

Jednak tylko jedna lokalna gałąź została przycięta. Niektóre z tych oddziałów zostały stworzone przeze mnie, inne przez współpracowników. Czy to przede wszystkim oznacza, że ​​nie śledziłem poprawnie tych gałęzi?

Felixyz
źródło
7
aby dowiedzieć się, które gałęzie zostaną usunięte, możesz zrobić git remote show origini poszukać wszystkich zaznaczonych gałęzistale
Someone Somewhere

Odpowiedzi:

189

Kiedy używasz git push origin :staleStuff, usuwa się automatycznie origin/staleStuff, więc kiedy biegałeś git remote prune origin, przycinałeś jakąś gałąź, która została usunięta przez kogoś innego. Bardziej prawdopodobne jest, że Twoi współpracownicy muszą teraz biec, git pruneaby pozbyć się usuniętych gałęzi.


Więc co dokładnie git remote prunerobi? Główny pomysł: lokalne oddziały (nie śledzące gałęzi) nie są dotykane przez git remote prunepolecenie i powinny być usuwane ręcznie.

A teraz prawdziwy przykład dla lepszego zrozumienia:

Masz zdalne repozytorium z 2 gałęziami: masteri feature. Załóżmy, że pracujesz na obu gałęziach, więc w rezultacie masz te odniesienia w swoim lokalnym repozytorium (podane są pełne nazwy referencyjne, aby uniknąć nieporozumień):

  • refs/heads/master(krótka nazwa master)
  • refs/heads/feature(krótka nazwa feature)
  • refs/remotes/origin/master(krótka nazwa origin/master)
  • refs/remotes/origin/feature(krótka nazwa origin/feature)

Teraz typowy scenariusz:

  1. Inny programista kończy wszystkie prace nad tym feature, scala go masteri usuwa featuregałąź ze zdalnego repozytorium.
  2. Domyślnie, gdy to zrobisz git fetch(lub git pull), żadne odniesienia nie są usuwane z lokalnego repozytorium, więc nadal masz wszystkie te 4 odniesienia.
  3. Postanawiasz je wyczyścić i uciekać git remote prune origin.
  4. git wykrywa, że featuregałąź już nie istnieje, więc refs/remotes/origin/featurejest to nieaktualna gałąź, którą należy usunąć.
  5. Teraz masz 3 odwołania, w tym refs/heads/feature, ponieważ git remote prunenie usuwa żadnych refs/heads/*odniesień.

Możliwe jest zidentyfikowanie oddziałów lokalnych, powiązanych ze zdalnymi oddziałami śledzenia, poprzez branch.<branch_name>.mergeparametr konfiguracyjny. Ten parametr nie jest naprawdę wymagany, aby cokolwiek działało (prawdopodobnie z wyjątkiem git pull), więc może go brakować.

(zaktualizowane przykładami i przydatnymi informacjami z komentarzy)

max
źródło
Zrozumiałem, że sytuacja wygląda następująco: gałęzie są nadal obecne lokalnie, ale usunięte ze zdalnego repozytorium. Teraz chcę usunąć wszystkie lokalne gałęzie, które nie istnieją na pilocie, dlatego uruchamiam git prune. To właśnie mówi do mnie „Te przestarzałe gałęzie zostały już usunięte ze zdalnego repozytorium”. Czy się mylę?
Felixyz
3
Masz rację, ale być może źle zrozumiałeś znaczenie „lokalnych oddziałów” w przypadku git prune. /refs/remotes/<remote_name>/Przycinaniu podlegają tylko gałęzie w kraju ; żadne gałęzie /refs/heads/nie zostaną dotknięte - musisz nimi ręcznie zarządzać.
maksymalnie
Aha, tak właśnie myślałem. Więc nie ma sposobu, aby zrobić to, co chcę: automatycznie usunąć wszystkie gałęzie w głowicach, które śledzą odległe gałęzie, sprawdzając, czy te zdalne gałęzie zostały usunięte?
Felixyz
2
Nie ma do tego wbudowanego polecenia, ale możesz sam napisać taki skrypt. Gałęzie śledzące można zidentyfikować po obecności branch.<branch_name>.mergeparametru config.
maksymalnie
Ta odpowiedź byłaby lepsza, gdybyś dodał informacje w komentarzach do samej odpowiedzi, aby każdy, kto tu przychodzi i ma to samo błędne przekonanie, co @Felixyz, nie musiał patrzeć na twoją odpowiedź śmiesznie, a następnie czytać komentarze, aby w końcu uzyskać zrozumienie .
Akrikos