Została wydana wersja rozproszonego systemu zarządzania kodem źródłowym Git 2.37. Git jest jednym z najpopularniejszych, niezawodnych i wydajnych systemów zarządzania wersjami, oferującym elastyczne narzędzia do nieliniowego rozwoju oparte na gałęziach i scalaniu. Aby zapewnić integralność historii i odporność na zmiany „wstecz”, używane jest niejawne haszowanie całej poprzedniej historii w każdym commitcie, możliwe jest również potwierdzenie cyfrowymi podpisami deweloperów poszczególnych tagów i commitów.
W porównaniu do poprzedniej wersji nowa edycja zawiera 395 zmian, przygotowanych przy udziale 75 deweloperów, z czego 20 wzięło udział w rozwijaniu po raz pierwszy. Główne nowości:
- Dopracowany do gotowości do powszechnego użycia mechanizm częściowych indeksów (sparse index), obejmujących tylko część repozytorium. Częściowe indeksy pozwalają zwiększyć wydajność i zaoszczędzić miejsce w repozytoriach, w których wykonuje się operacje częściowego klonowania (sparse-checkout) lub pracuje się z niepełną kopią repozytorium. W nowej wersji zakończono pracę nad integracją częściowych indeksów w poleceniach „git show”, „git sparse-checkout” i „git stash”. Najbardziej zauważalny wzrost wydajności z użycia częściowych indeksów odnotowano w poleceniu „git stash”, którego czas wykonania w niektórych sytuacjach wzrósł o 80%.
- Wprowadzono nowy mechanizm „cruft packs” do pakowania obiektów niedostępnych (unreachable), do których w repozytorium brak jest odniesień (brak odniesień z gałęzi lub tagów). Obiekty niedostępne są usuwane przez zbieracz śmieci, ale przez pewien czas po usunięciu pozostają w repozytorium, aby uniknąć stanów wyścigu. Aby śledzić okres, w którym znajdują się niedostępne obiekty, konieczne jest przypisanie im etykiet z czasem zmiany tych obiektów, co uniemożliwia ich przechowywanie w jednym pliku pakietu, w którym wszystkie obiekty mają wspólny czas zmiany. Poprzednia metoda przechowywania każdego obiektu w osobnym pliku prowadziła do problemów przy dużej liczbie świeżych niedostępnych obiektów, które nie podlegały jeszcze usunięciu. Proponowany mechanizm „cruft packs” umożliwia przechowywanie wszystkich obiektów niedostępnych w jednym pliku pakietu, a dane dotyczące czasu modyfikacji każdego obiektu odzwierciedlane są w oddzielnej tabeli przechowywanej w pliku z rozszerzeniem „.mtimes”.
- Dla systemów Windows i macOS wprowadzono wbudowany mechanizm śledzenia zmian w systemie plików, który pozwala na uniknięcie przeszukiwania całego katalogu roboczego przy wykonywaniu takich operacji jak „git status”. Wcześniej do śledzenia zmian przez hooki mogły być wykorzystywane zewnętrzne narzędzia do śledzenia zmian w systemie plików, takie jak Watchman, co wymagało instalacji dodatkowych programów i konfiguracji. Teraz ta funkcjonalność jest wbudowana i można ją włączyć poleceniem „git config core.fsmonitor true”.
- W poleceniu „git sparse-checkout” ogłoszono przestarzałą obsługę alternatywnego trybu „—cone” metody określania wzorców dla częściowego klonowania, który pozwalał na wymienianie pojedynczych plików przy użyciu składni „.gitignore” podczas określania części repozytorium podlegającej operacji klonowania, co uniemożliwiało stosowanie częściowych indeksów w celu optymalizacji.
- Zwiększona elastyczność konfiguracji wywołania fsync() do zapisania zmian na dysk. Do parametru „core.fsyncMethod” dodano wsparcie dla strategii synchronizacji „batch”, co przyspiesza operacje zapisu dużej liczby pojedynczych plików poprzez gromadzenie zmian w pamięci podręcznej, która jest zapisywana jednym wywołaniem fsync(). Test wykazał, że dodanie 500 plików za pomocą polecenia „git add” zajęło 0,15 sekundy w nowym trybie, podczas gdy wywołanie fsync() dla każdego pliku trwało 1,88 sekundy, a bez użycia fsync — 0,06 sekundy.
- Do poleceń do przeszukiwania gałęzi, takich jak „git log” i „git rev-list”, dodano opcję „—since-as-filter=X”, która umożliwia filtrowanie informacji o commitach, które zostały utworzone przed czasem „X”. W przeciwieństwie do opcji „—since”, nowa komenda działa jako filtr, który nie przerywa przeszukiwania po pierwszym commicie przekraczającym zadany czas.
- W poleceniu „git remote” dodano flagę „-v”, która umożliwia wyświetlanie informacji o częściowych klonach repozytorium.
- Dodano ustawienie „transfer.credentialsInUrl”, które może przyjmować wartości „warn”, „die” i „allow”. W przypadku podania w parametrze „remote.<name>.url” danych logowania w postaci tekstowej, próba wykonania operacji „fetch” lub „push” zakończy się błędem, jeśli ustawienie „transfer.credentialsInUrl” ma wartość „die”, lub ostrzeżeniem, jeśli jest ustawiona na „warn”.
- Domyślnie wprowadzono nową implementację interaktywnego trybu polecenia „git add -i”, przepisaną z Perla na C.
Źródło: opennet.ru
