Podczas pierwszego klonowania repozytorium, git najpierw otrzymuje obiekty (co jest dość oczywiste), a następnie spędza mniej więcej tyle samo czasu na „rozwiązywaniu delt”. Co tak naprawdę dzieje się w tej fazie klonowania?
Podczas pierwszego klonowania repozytorium, git najpierw otrzymuje obiekty (co jest dość oczywiste), a następnie spędza mniej więcej tyle samo czasu na „rozwiązywaniu delt”. Co tak naprawdę dzieje się w tej fazie klonowania?
Odpowiedzi:
Git używa kodowania delta do przechowywania niektórych obiektów w plikach pakietów. Jednak nie chce mieć, aby odtworzyć każdą zmianę kiedykolwiek na danym pliku w celu uzyskania aktualnej wersji, więc Git posiada również okolicznościowe migawek zawartości plików zapisanych jako dobrze. „Rozstrzyganie delt” to krok polegający na upewnieniu się, że wszystko pozostaje spójne.
Oto rozdział z sekcji „Git Internals” książki Pro Git, która jest dostępna online, która mówi o tym.
git gclub kiedy Git uzna to za konieczne) Git skompresuje wszystkie „luźne” pliki do pliku pakietu, aby zaoszczędzić miejsce, i utworzony zostanie plik indeksu w tym pliku pakietu. Więc zlib będzie kompresował przy użyciu własnego algorytmu delta, ale Git używa kodowania delta do przechowywania wcześniejszych wersji. Ponieważ najczęstszym i najczęstszym dostępem jest najnowsza wersja, która jest przechowywana jako migawka.
Etapy git cloneto:
„Rozwiązywanie delt” to komunikat pokazany dla drugiego etapu, indeksujący plik paczki („git index-pack”).
Pliki paczek nie zawierają rzeczywistych identyfikatorów obiektów, a jedynie treść obiektu. Aby ustalić, czym są identyfikatory obiektów, git musi wykonać dekompresję + SHA1 każdego obiektu w pakiecie, aby wygenerować identyfikator obiektu, który jest następnie zapisywany w pliku indeksu.
Obiekt w pliku paczki może być przechowywany jako delta, tj. Sekwencja zmian, które należy wprowadzić w innym obiekcie. W takim przypadku git musi pobrać obiekt podstawowy, zastosować polecenia i SHA1 wynik. Sam obiekt podstawowy może wymagać wyodrębnienia przez zastosowanie sekwencji poleceń delta. (Mimo że w przypadku klonu obiekt bazowy został już napotkany, istnieje ograniczenie liczby przechowywanych obiektów w pamięci podręcznej).
Podsumowując, etap „rozwiązywania delt” obejmuje dekompresję i sumowanie kontrolne całej bazy danych repo, co nie jest zaskakujące dość długo. Przypuszczalnie dekompresja i obliczanie SHA1 zajmuje więcej czasu niż stosowanie poleceń delta.
W przypadku kolejnego pobierania, odebrany plik paczki może zawierać odniesienia (jako podstawy obiektów delta) do innych obiektów, które powinien mieć już otrzymujący git. W takim przypadku git odbierający faktycznie przepisuje odebrany plik paczki, aby zawierał takie odwołania do obiektów, tak że każdy przechowywany plik paczki jest samowystarczalny. To może być początek wiadomości „rozwiązywanie delt”.
Bursztyn wydaje się opisywać model obiektowy, który wykorzystuje Mercurial lub podobny. Git nie przechowuje delt między kolejnymi wersjami obiektu, ale za każdym razem pełne migawki obiektu. Następnie kompresuje te migawki za pomocą kompresji delta, próbując znaleźć dobre delty do użycia, niezależnie od tego, gdzie w historii one istnieją.