Wydano wersję rozproszonego systemu zarządzania kodem źródłowym Git 2.31. 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 łączeniu. Aby zapewnić integralność historii i odporność na zmiany "z wstecz", korzysta się z ukrytego haszowania całej wcześniejszej historii w każdym commicie, możliwe jest także uwierzytelnienie cyfrowymi podpisami deweloperów dla poszczególnych tagów i commitów.
W porównaniu do poprzedniej wersji, nowa wersja zawiera 679 zmian, przygotowanych przez 85 deweloperów, z czego 23 brało udział w projekcie po raz pierwszy. Główne nowości:
- Dodano polecenie „git maintenance”, które umożliwia wykonywanie okresowych prac w systemach nieobsługujących cron. Na przykład za pomocą nowego polecenia można zorganizować cykliczne uruchamianie procesu pakowania repozytorium, aby nie czekać na zakończenie blokady repozytorium podczas automatycznego pakowania przy uruchamianiu różnych poleceń. Polecenie „git maintenance” pozwala na wykonywanie optymalizacji i operacji utrzymania optymalnej struktury repozytorium w tle, nie blokując sesji interaktywnej — co godzinę wykonywana jest praca związana z wczesnym ładowaniem najnowszych obiektów z zdalnego repozytorium i aktualizowaniem pliku z grafem commitów, a każdej nocy uruchamiany jest proces pakowania repozytorium.
- Dodano wsparcie dla prowadzenia na dysku odwrotnego indeksu (revindex) dla plików pakietów. Przypomnijmy, że Git przechowuje wszystkie dane w formie obiektów, które są umieszczane w oddzielnych plikach. Aby zwiększyć wydajność pracy z repozytorium, obiekty są dodatkowo umieszczane w plikach pakietów, w których informacje przedstawione są w formie strumienia obiektów następujących po sobie (analogiczny format używany jest podczas przesyłania obiektów poleceniami git fetch i git push). Dla każdego pliku pakietu tworzony jest plik indeksowy (.idx), który pozwala na szybkie określenie offsetu w pliku pakietu na podstawie identyfikatora obiektu, w którym przechowywany jest dany obiekt. Wprowadzony w Git 2.31 odwrotny indeks (.rev) ma na celu optymalizację procesu określania identyfikatora obiektu na podstawie informacji o lokalizacji obiektu w pliku pakietu.
Wcześniejsze przetwarzanie odbywało się w locie podczas analizy pliku pack i było przechowywane tylko w pamięci, co uniemożliwiało ponowne wykorzystanie takich indeksów i zmuszało do generowania indeksu za każdym razem. Operacja budowy indeksu sprowadza się do tworzenia tablicy z par "obiekt-pozycja" i sortowania jej według pozycji, co może zajmować dużo czasu w przypadku dużych plików pack.
Na przykład operacja wyświetlania zawartości obiektów, w której używany jest bezpośredni indeks, była wykonywana 62 razy szybciej niż operacja pokazywania rozmiaru obiektów, dla której dane o powiązaniu pozycji z obiektem nie były indeksowane. Po zastosowaniu indeksu odwrotnego podane operacje zajmują teraz mniej więcej tyle samo czasu. Indeksy odwrotne pozwalają również przyspieszyć operacje przesyłania obiektów podczas wykonywania poleceń fetch i push dzięki bezpośredniemu przesyłaniu już gotowych danych z dysku. Domyślnie indeksy odwrotne nie są tworzone, aby je wygenerować, konieczne jest włączenie ustawienia "git config pack.writeReverseIndex true" z następującym spakowaniem repozytorium poleceniem "git repack -Ad".
- Dodano optymalizacje wydajności oparte na wprowadzeniu w formacie pliku commit-graph, używanym do optymalizacji dostępu do informacji o commitach, nowych danych o numerze generacji commitów, które mogą być używane do przyspieszania dodatkowych operacji z commitami.
- Rozszerzone możliwości nadpisywania domyślnej nazwy głównej gałęzi w nowych repozytoriach (ustawienie init.defaultBranch). Przy dostępie do zewnętrznych repozytoriów git próbuje wydobyć gałąź, na którą wskazuje HEAD, tzn. jeśli zewnętrzne serwer używa domyślnie gałęzi "main", to operacja "git clone" spróbuje lokalnie wydobyć "main". W Git 2.31 wsparcie dla takiego wydobycia jest teraz wdrożone także dla pustych repozytoriów. Na przykład przy lokalnym klonowaniu nowego repozytorium przed dodaniem pierwszych patchy, lokalna kopia będzie teraz zawierać ustawioną na zewnętrznej serwerze domyślną nazwę głównej gałęzi.
- Do polecenia "git rev-list" dodano opcję "--disk-usage", która pozwala na wyświetlenie podsumowania rozmiaru obiektów.
- W oczekiwaniu na nadchodzącą zmianę backendu do realizacji scalania, znacznie zoptymalizowano określanie zmiany nazw.
- Wsparcie dla przestarzałej biblioteki wyrażeń regularnych PCRE1 zostało zakończone.
- Dodano możliwość wymuszenia zakazu używania skróconych linków, działającego niezależnie od algorytmu haszowania. Zakaz włącza się przez przypisanie wartości «no» do parametru core.abbrev.
- Do polecenia «git rev-parse» dodano opcję «—path-format=(absolute|relative)» do jawnego określenia, czy wyjście ma być względne, czy absolutne.
- W skryptach do automatycznego uzupełniania w Bash uproszczono dodawanie reguł uzupełniania dla własnych podkomend «git».
- Do polecenia «git bundle» dodano opcję «—stdin» do odczytu linków z standardowego wejścia.
- Do polecenia «git log» dodano nową opcję «—diff-merges=».
- Do polecenia «git ls-files» dodano opcję «—deduplicatecan» do usuwania duplikatów podczas wyjścia.
- Dodano nowe maski do wykluczania zakresu commitów — «^!» i «^-».
- Do polecenia «git range-diff» dodano opcje «—left-only» i «—right-only» do wyświetlania tylko jednej strony porównywanego zakresu.
- Do poleceń «git diff» i «git log» dodano opcje «—skip-to=» i «—rotate-to=» do pomijania lub przenoszenia do końca początkowych ścieżek.
- Do polecenia «git difftool» dodano opcję «—skip-to=» do wznowienia przerwanego sesji z dowolnej ścieżki.
- Kodeks postępowania (Code-of-conduct), określający podstawowe zasady rozwiązywania konfliktów między programistami, został zaktualizowany do wersji 2.0 (wcześniej używana wersja 1.4).
Źródło: opennet.ru
