Mam repozytorium Git z dużą ilością zatwierdzeń, które nie znajdują się w żadnej konkretnej gałęzi, mogę git show
je zrobić , ale kiedy próbuję wyświetlić listę gałęzi, które je zawierają, nic nie informuje.
Myślałem, że jest to problem z wiszącymi zatwierdzeniami / drzewem (wynikający z gałęzi -D), więc przyciąłem repozytorium, ale nadal widzę to samo zachowanie po tym:
$ git fetch origin
$ git fsck --unreachable
$ git fsck
Brak wyjścia, nic nie zwisa (prawda?). Ale zatwierdzenie istnieje
$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...
i nie jest osiągalny przez żadną gałąź jako
$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042
nie daje wyjścia.
Jaki dokładnie jest stan tego zatwierdzenia? Jak mogę wymienić wszystkie zatwierdzenia w podobnym stanie? Jak mogę usunąć takie zmiany?
git
branch
git-dangling
Samer Buna
źródło
źródło
Odpowiedzi:
Zauważ, że zatwierdzenia, do których odwołuje się Twój reflog, są uważane za osiągalne.
Podaj,
--no-reflogs
aby przekonaćgit fsck
Cię do ich pokazania.Gdy Twoje wpisy reflog wygasną, te obiekty zostaną również wyczyszczone przez
git gc
.Waży regulują
gc.pruneexpire
,gc.reflogexpire
orazgc.reflogexpireunreachable
ustawień. Por.git help config
.Wszystkie wartości domyślne są całkiem rozsądne.
źródło
git help glossary
definiuje to w ten sposób… podczas gdy jego definicja „osiągalnego” nie jest w ten sposób zawężona, więc są ze sobą sprzeczne. Zabawne - więc to, co powiedziałem, jest właściwie zgodne z zamieszaniem wgitglossary
… To nie pojęcia są mylące, tylko terminologia. Chodzi o to, że „wiszące” zatwierdzenia to takie, na które nic innego nie wskazuje. Czy pomogłoby, gdybym powiedział „reflogs dla innych nieosiągalnych zatwierdzeń”…?master
jesteś na gałęzi , robiszgit commit
i otrzymujesz zatwierdzenie000001
. Wtedy robiszgit commit --amend
, co daje ci zobowiązanie000002
. Nie ma już żadnych tagów ani gałęzi wskazujących na000001
, i nie możesz ich zobaczyć w swoim dzienniku bez--reflog
opcji, ale jeśli chcesz, nadal możesz się do tego dostać za pomocągit checkout 000001
. Teraz pytanie brzmi: czy jest000001
to wiszące zatwierdzenie, czy nieosiągalne zatwierdzenie, czy żadne z nich, czy jedno i drugie?Aby usunąć wszystkie wiszące zatwierdzenia i te dostępne z reflogów, wykonaj następujące czynności:
Ale upewnij się, że tego chcesz. Zalecam przeczytanie stron podręcznika, ale oto sedno:
git gc
usuwa nieosiągalne obiekty (zatwierdzenia, drzewa, bloby (pliki)). Obiekt jest nieosiągalny, jeśli nie jest częścią historii jakiejś branży. Właściwie jest to trochę bardziej skomplikowane:git gc
robi inne rzeczy, ale nie są one tutaj istotne i nie są niebezpieczne.Nieosiągalne obiekty młodsze niż dwa tygodnie nie są usuwane, więc używamy,
--prune=now
co oznacza „usuń nieosiągalne obiekty, które zostały utworzone wcześniej”.Obiekty mogą być również osiągane przez reflog. Podczas gdy gałęzie rejestrują historię niektórych projektów, reflogi rejestrują historię tych gałęzi. Jeśli zmienisz, zresetujesz itp., Zmiany zostaną usunięte z historii gałęzi, ale git zachowa je na wypadek, gdybyś zdał sobie sprawę, że popełniłeś błąd. Reflogs to wygodny sposób na sprawdzenie, jakie destrukcyjne (i inne) operacje zostały wykonane na gałęzi (lub HEAD), ułatwiając cofnięcie destrukcyjnej operacji.
Musimy więc również usunąć reflogs, aby faktycznie usunąć wszystko, co nie jest osiągalne z gałęzi. Robimy to poprzez wygasanie
--all
reflogów. Znowu git zachowuje nieco z reflogs aby chronić użytkowników, więc znowu trzeba powiedzieć to, aby nie zrobić tak:--expire-unreachable=now
.Ponieważ używam głównie reflogów do regeneracji po destrukcyjnych operacjach, zwykle używam
--expire=now
zamiast tego, co całkowicie niszczy reflogs.źródło
git reflog expire --expire-unreachable=now --all
upuszcza wszystkie twoje skrytki!Miałem ten sam problem, po wykonaniu wszystkich rad w tym wątku:
Jeśli to nie jest reflog ani gałąź, ... to musi być tag !
git tag -d <tagname>
Usunąłem tagi i ponownie uporządkowałem czyszczenie, a stare zatwierdzenia zniknęły.źródło
prawdopodobnie po prostu musi być
raportować również o oddziałach z pilotów
źródło
git push -d origin next
nie pomaga.git fetch --prune
załatwił sprawę. ale we wszystkich odpowiedziach brakuje mi sprawdzania tagów, które odwołują się do tego zatwierdzenia. Nadal nie wiem, jak sprawdzić tagi z zatwierdzeniem (usunąłem wszystkie).git fsck --unreachable
faktycznie komunikują się przez sieć ze zdalnym, aby dowiedzieć się, które zatwierdzenia są osiągalne?git fsck --unreachable
nie musi komunikować się przez sieć ze zdalnym, aby dowiedzieć się, które gałęzie zdalne zawierają które zatwierdzenia. Informacje o zdalnym oddziale są przechowywane lokalnie, pod np..git/refs/remotes/origin
(Lub wpacked-refs
).Miałem podobny problem. Pobiegłem
git branch --contains <commit>
i nie zwróciło żadnego wyniku, tak jak w pytaniu.Ale nawet po biegu
mój commit był nadal dostępny przy użyciu
git show <commit>
. Było tak, ponieważ jeden z zatwierdzeń w jego odłączonej / wiszącej „gałęzi” został oznaczony. Usunąłem tag, ponownie uruchomiłem powyższe polecenia i byłem złoty.git show <commit>
wróciłemfatal: bad object <commit>
- dokładnie to, czego potrzebowałem. Mam nadzieję, że pomoże to komuś, kto utknął tak samo jak ja.źródło
Przypadkowo trafiłem na tę samą sytuację i odkryłem, że moje skrytki zawierają odniesienie do nieosiągalnego zatwierdzenia, a zatem domniemane nieosiągalne zatwierdzenie było osiągalne ze skrytek.
To właśnie zrobiłem, aby uczynić go naprawdę nieosiągalnym.
źródło
git gc --prune=<date>
domyślnie przycina obiekty starsze niż dwa tygodnie temu. Możesz ustawić późniejszą datę. Jednak polecenia git, które tworzą luźne obiekty, generalnie będą uruchamiać git gc --auto (który czyści luźne obiekty, jeśli ich liczba przekracza wartość zmiennej konfiguracyjnej gc.auto).Czy na pewno chcesz usunąć te zatwierdzenia? Domyślne ustawienie gc.auto zapewnia, że luźne obiekty nie zajmują zbyt dużej ilości pamięci, a przechowywanie luźnych obiektów przez pewien czas jest ogólnie dobrym pomysłem. W ten sposób, jeśli jutro zdasz sobie sprawę, że usunięta gałąź zawierała zatwierdzenie, którego potrzebujesz, możesz je odzyskać.
źródło