Do jakich „luźnych obiektów” odnosi się interfejs Git?

219

Kiedy otwieram Git GUI , pojawia się komunikat, do którego się odnosi loose objects. Zrobiłem to git gci usunąłem wiadomość.

Co to jest loose objectsi jak mogę temu zapobiec?

okso
źródło
Możesz po prostu kliknąć „Tak” w wyskakującym komunikacie, gdy pojawi się pytanie, czy luźne obiekty powinny być teraz zapakowane. Git GUI uruchomi się git gcdla ciebie, z ładnym paskiem postępu GUI (choć pokazywany jest jako zablokowany przez większość czasu).
ADTC

Odpowiedzi:

144

Obiekt (obiekty BLOB, drzewa i zatwierdzenia) z SHA powiedzą - 810cae53e0f622d6804f063c04a83dbc3a11b7ca będzie przechowywany w

.git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca

(podział na pierwsze dwa znaki w celu poprawy wydajności systemu plików, ponieważ obecnie nie wszystkie obiekty są przechowywane w tym samym katalogu)

Obiekty przechowywane jak wyżej nazywane są obiektami sypkimi.

Kiedy zaczynasz od swojego repo, najczęściej masz luźne przedmioty. Gdy liczba rośnie, staje się nieefektywna i są one przechowywane w pliku paczki. Takie obiekty nazywane są obiektami spakowanymi.

 git gc

to jest to, co uruchamiasz, aby spakować obiekty (Zwykle luźne obiekty, które nie są potrzebne, a kilka tygodni też są usuwane, a dzięki --prune=<date>opcji możesz wymusić usunięcie luźnych obiektów, które nie są już potrzebne. Tak jak w przypadku zmiany zatwierdzenia. Stary obiekt zatwierdzenia nie jest dłużej potrzebne).

manojlds
źródło
3
--pruneOpcja jest domyślnie włączona, a ponieważ git gcjest automatycznie uruchamiany przez potocznym (np commit), zazwyczaj nie trzeba się martwić o to. Nie używam git gui i nie mogę znaleźć dokładnie, gdzie jest on wyzwalany w źródle, ale albo wykonuje własną kontrolę, albo po prostu przechwytuje gcwyzwalane przez wywołane polecenie. Z pewnością nie ma się o co martwić, po prostu spowodowane zwykłym użytkowaniem.
Cascabel,
21
czy jest jakaś wada pakowania luźnych przedmiotów? Jeśli nie, to dlaczego Git nie robi tego automatycznie?
Louis Rhys
13
Nie sądzę, że to prawda, że ​​dzieje się to automatycznie. Często popełniam, ale wspomniane „git gui” zawierało 50 000 luźnych obiektów (i zastanawiałem się, dlaczego git był tak cholernie powolny, duży projekt przez ~ 4 lata bez ręcznego gc)
Kevin
1
@Kevin Czy wydajność Twojego dużego projektu poprawiła się po git gcręcznym uruchomieniu ? Myślę, że powinno się to poprawić, ponieważ luźne obiekty są nieefektywne, a 50 000 to bardzo duża liczba. Dowiedziałem się również, że pakowanie znacznie zmniejsza również przestrzeń używaną przez .gitfolder.
ADTC
3
@LouisRhys, „Kiedy obiekty są zapisywane na dysk, często mają one format luźny, ponieważ dostęp do tego formatu jest tańszy. Jednak ostatecznie będziesz chciał zaoszczędzić miejsce, pakując obiekty” - z Git Book link w odpowiedzi poniżej
Chris
39

Git Book wyjaśnia to całkiem dobrze: https://git-scm.com/book/en/v2/Git-Internals-Packfiles

Luźne obiekty są prostszym formatem. Jest to po prostu skompresowane dane przechowywane w jednym pliku na dysku. Każdy obiekt zapisany w osobnym pliku.

Mohamed Mansour
źródło