Po dwóch miesiącach prac rozwojowych opublikowano wersję 2.39 rozproszonego systemu zarządzania kodem źródłowym Git. Git jest jednym z najpopularniejszych, niezawodnych i wydajnych systemów kontroli wersji, oferującym elastyczne narzędzia do nieliniowego rozwoju, bazujące na gałęzieniu i scalaniu. Aby zapewnić integralność historii i odporność na zmiany 'wstecz', stosowane jest niejawne haszowanie całej poprzedniej historii w każdym commicie, a także możliwe jest uwierzytelnianie cyfrowymi podpisami deweloperów poszczególnych tagów i commitów.
W porównaniu z poprzednią wersją w nowej wersji wprowadzono 483 zmian, przygotowanych z udziałem 86 deweloperów, z których 31 po raz pierwszy wzięło udział w pracach. Główne nowości:
- Do zespołu ‘git shortlog’, służącego do wyświetlania podsumowań ze statystykami z historii zmian, dodano opcję ‘—group’, umożliwiającą dowolną grupowanie commitów według pól, nie ograniczających się do autora lub commiter. Na przykład, aby wyświetlić listę deweloperów z informacją o liczbie zmian uwzględniającej współautorów, wymienionych w polu ‘Co-authored-by’, można użyć komendy: git shortlog -ns —group=author —group=trailer:co-authored-by
Вывод shortlog можно агрегировать при помощи спецификаторов форматирования и опция «—group» позволяет существенно упростить создание сложных отчётов и избавиться от выполнении дополнительных команд сортировки. Например, для создания отчёта с информацией о том, сколько коммитов для заданного релиза было принято в каждом месяце, можно указать: git shortlog v2.38.0.. —date=’format:%Y-%m’ —group=’%cd’ -s 2 2022-08 47 2022-09 405 2022-10 194 2022-11 5 2022-12 Раньше для выполнения аналогичной операции потребовалось бы привлечение утилит sort и uniq: git log v2.38.0.. —date=’format:%Y-%m’ —format=’%cd’ | sort | uniq -c
- Rozszerzone możliwości mechanizmu „cruft packs”, przeznaczonego do pakowania niedostępnych obiektów, do których w repozytorium nie ma odniesień (nie są zalinkowane przez gałęzie ani tagi). Niedostępne obiekty są usuwane przez zbieracza śmieci, ale przez pewien czas pozostają w repozytorium, aby wyeliminować warunki wyścigu. Mechanizm „cruft packs” umożliwia przechowywanie wszystkich niedostępnych obiektów w jednym pliku pakietu, a dane o czasie modyfikacji każdego obiektu są odzwierciedlane w osobnej tabeli, przechowywanej w oddzielnym pliku z rozszerzeniem „.mtimes”, aby nie kolidowały z ogólnym czasem zmiany.
Czas przechowywania niedostępnych obiektów w repozytorium przed ich faktycznym usunięciem jest określany przez opcję „—prune=”. Mimo że opóźnienie przed usunięciem jest wystarczająco skutecznym i praktycznym sposobem zapobiegania uszkodzeniu repozytorium z powodu wyścigu warunków, nie jest ono w 100% niezawodne. Aby uprościć odzyskiwanie uszkodzonego repozytorium, w nowym wydaniu dodano możliwość zachowania brakujących obiektów. Do polecenia „git repack” dodano opcję „—expire-to”, która pozwala na określenie pliku do utworzenia zewnętrznej kopii wszystkich usuwanych obiektów. Na przykład, aby zapisać w pliku backup.git niedostępne obiekty, które nie zmieniały się przez ostatnie 5 minut, można użyć polecenia: git repack —cruft —cruft-expiration=5.minutes.ago -d —expire-to=../backup.git
- Zdecydowanie zwiększono (o 70%) prędkość wykonywania operacji „git grep —cached” w poszukiwaniu w obszarach, w których stosuje się częściowe klonowanie (sparse-checkout), dla których istnieją częściowe indeksy (sparse index). Wcześniej podczas wskazywania opcji „—cached” najpierw przeprowadzano wyszukiwanie w zwykłym indeksie, a następnie w częściowych, co prowadziło do odczuwalnych opóźnień przy wyszukiwaniu w dużych repozytoriach.
- Przyspieszono wykonanie na serwerze sprawdzanie spójności nowych obiektów przed ich umieszczeniem w repozytorium podczas operacji „git push”. Dzięki przejściu do uwzględniania wyłącznie zadeklarowanych odniesień, w testowym repozytorium z 7 milionami odniesień, z których tylko 3% jest objętych operacją push, wprowadzone optymalizacje pozwoliły skrócić czas sprawdzania 4,5 razy.
- Aby chronić przed potencjalnymi przepełnieniami licznymi w kodzie, w poleceniu „git apply” ograniczono maksymalny rozmiar przetwarzanych łatek. W przypadku, gdy rozmiar łatki przekracza 1 GB, teraz zostanie wyświetlony błąd.
- Aby chronić przed potencjalnymi lukami w zabezpieczeniach, wprowadzono zmiany mające na celu oczyszczenie zbędnych informacji z nagłówków, które są ustawiane przy użyciu modułu h2h3 z opcją GIT_TRACE_CURL=1 lub GIT_CURL_VERBOSE=1 w połączeniu z HTTP/2.
- Podczas wykonywania operacji checkout z gałęzi, która jest symbolicznym odnośnikiem do innej gałęzi, polecenie „git symbolic-ref HEAD” teraz wyświetla nazwę docelowej gałęzi, a nie nazwę symbolicznego odnośnika.
- Dodano wsparcie dla argumentu @{-1} w opcji „—edit-description” („git branch —edit-description @{-1}”), aby edytować opis poprzedniej gałęzi.
- Dodano polecenie „git merge-tree —stdin”, które pozwala na przesłanie listy parametrów przez standardowy strumień wejściowy.
- Na zdalnych systemach plikowych domyślnie wyłączony jest wskaźnik fsmonitor, monitorujący zmiany w systemie plików.
Źródło: opennet.ru
