Wydanie Git 2.55 z domyślnym wsparciem dla Rust

Zaktualizowano wydanie rozproszonego systemu zarządzania kodem źródłowym Git 2.55. Wśród kluczowych zmian znajduje się: domyślne włączenie budowy z Rust, realizacja dla systemu Linux procesu fsmonitor, nowa strategia ponownego pakowania inkrementalnego indeksu MIDX, polecenie „git history fixup” do poprawy commitów, optymalizacja generowania bitmap dostępności obiektów, wsparcie dla równoległego wykonywania hooków oraz polecenie „git format-rev”. Kod Git jest rozpowszechniany na zasadach licencji GPLv2+.

W porównaniu do poprzedniego wydania, nowa wersja zawiera 505 zmian, przygotowanych przy udziale 100 programistów, z których 33 uczestniczyło po raz pierwszy w rozwijaniu Git. Główne nowości (1, 2, 3):

  • Domyślnie włączona jest obsługa komponentów w języku Rust. Kompilator rustc
    został dodany do zależności budowlanych. Aby zbudować bez Rust, można użyć flagi „NO_RUST=1” przy uruchomieniu narzędzia make lub „-Drust=disabled” przy wykonaniu „meson configure”. Możliwość wyłączenia budowy z Rust będzie wspierana do gałęzi Git 3.0, w której Rust zostanie włączony w grupę obowiązkowych zależności. W języku Rust zaimplementowano warstwę przenośności między konfiguracjami z hashami SHA-1 i SHA-256, a także niektóre funkcje wewnętrzne, takie jak kodowanie i dekodowanie wartości całkowitych o zmiennej długości. W przyszłości planuje się przerobienie na Rust bardziej znaczących wewnętrznych komponentów Git.
  • Do eksperymentalnego polecenia „git history”, które oferuje możliwości do przepisania historii zmian, dodano operację „git history fixup” do poprawy commitów. Operacja „fixup” pozwala przenieść zmiany dodane za pomocą „git add” do wcześniejszego commita i automatycznie przepisać wszystkie kolejne commity, podobnie jak przy wykonaniu polecenia „git commit —fixup=<commit>” i uruchomieniu „git rebase —autosquash <commit>~”.
  • Dla platformy Linux zaimplementowano proces w tle fsmonitor, który monitoruje zmiany w systemie plików za pomocą mechanizmu inotify i pozwala na uniknięcie przeszukiwania całego katalogu roboczego przy wykonywaniu takich poleceń jak „git status”. Włączenie następuje przez ustawienie „core.fsmonitor”.
  • Do zespołu „git repack” dodany został tryb „—write-midx=incremental”, który wprowadza nową strategię aktualizacji metadanych w inkrementalnym MIDX-index (multi-pack index), co pozwala na uniknięcie ponownego pakowania całego indeksu. W inkrementalnym indeksie wielopakowym zamiast jednego dużego indeksu zawierającego informacje o rozmieszczeniu obiektów w plikach pakietowych, wprowadzono podział na warstwy — każda warstwa obejmuje określoną liczbę plików pakietowych i jest przechowywana w osobnym pliku bitmapowym. Taka struktura umożliwia dodawanie do indeksu danych o obiektach w nowych plikach pakietowych, przymocowując do indeksu nowe warstwy bez przebudowywania już istniejących warstw.

    Polecenie „git repack —write-midx=incremental” pozwala dodać nową warstwę do inkrementalnego MIDX-indeksu, obejmującą ostatnio utworzone pliki pakietowe. W połączeniu z trybem pakowania repozytoriów „—geometric” nowe polecenie umożliwia łączenie nowych obiektów z kilku plików pakietowych w jeden większy plik pakietowy oraz, w razie potrzeby, pakowanie i scalanie kilku sąsiednich warstw inkrementalnego MIDX-indeksu. Taka strategia pozwala przy wykonywaniu „git repack” przepisywać tylko górne warstwy, pozostawiając starsze duże warstwy nietknięte, a także wykluczyć niekontrolowany wzrost łańcucha warstw, utrzymując ogólną liczbę warstw na poziomie proporcjonalnym do logarytmu całkowitej liczby obiektów.

  • Zdecydowanie zoptymalizowano generację bitmap dostępności obiektów dzięki nowemu algorytmowi przeszukiwania drzewa obiektów, który eliminował zbędną rekurencję, buforując pozycje obiektów, sortując bitmapy przed ich połączeniem operacją XOR oraz przetwarzając kod do tworzenia bitmap pseudo-sc fusion (pseudo-merge). W testowym repozytorium optymalizacje pozwoliły skrócić czas generacji bitmap z 612 do 294 sekund.
  • Wprowadzono możliwość równoległego wykonywania niezależnych hooków w plikach konfiguracyjnych. Równolegle nie mogą być uruchamiane hooki, które wpływają na wspólny stan lub go uwzględniają, na przykład zmieniające notatki do commitów lub inspekcjonujące indeksy i drzewo robocze. Można jednak równolegle uruchamiać hooki do sprawdzania linterskich oraz przeprowadzania testów jednostkowych. Hooki umożliwiające równoległe wykonanie są konfigurowane za pomocą parametru „hook.nazwa_huka.parallel = true”. Liczba pracy uruchamianej jednocześnie określa się poprzez konfigurację hook.jobs, hook..jobs lub opcję wiersza poleceń „-j”.
  • W poleceniu „git pack-objects —path-walk” dodano możliwość określenia filtrów, takich jak „blob:none”, „blob:limit=”, „tree:0”, „object:type=”, „sparse:” oraz „combine:”. W przeprowadzonym teście odrzucenie blobów podczas wykonania „—path-walk” pozwoliło na 16% zmniejszenie rozmiaru utworzonego pliku pack.
  • Dodano polecenie „git format-rev” do formatowania rewizji i nazw obiektów, wspomnianych w listach commitów lub występujących w dowolnym tekście (na przykład, można użyć w hookach do przetwarzania notatek do commitów).

    git last-modified | git format-rev —stdin-mode=text —format=%an

    Junio C Hamano builtin/commit.c

  • Domyślnie włączono eskalowanie większości sekwencji sterujących terminalem w komunikatach informacyjnych i tekście błędów, które są przekazywane serwerem. W przypadku odniesienia do złośliwego serwera takie sekwencje escape mogły być używane do ukrywania lub modyfikacji wyjścia, na przykład poprzez sekwencje escape do przesuwania kursora i czyszczenia tekstu. Pozostawiono wsparcie dla sekwencji escape do podświetlania elementów kolorem.
  • Polecenie „git checkout -m” teraz automatycznie zapisuje konflikty lokalnych zmian w obszarze stash bez konieczności natychmiastowego rozwiązywania konfliktu.
  • Do polecenia „git push” dodano możliwość umieszczenia gałęzi na kilku zewnętrznych serwerach Git jednym poleceniem. Na przykład, aby przesłać gałąź main na nie tylko na główny serwer, ale także na lustra, można utworzyć grupę „publish” z serwerów „github”, „gitlab” i „mirror”:

    git config remotes.publish „github gitlab mirror”
    git push publish main

  • Do zespołu «git log —graph» dodano opcję «—graph-lane-limit=» w celu ograniczenia liczby pionowych pasków przy wizualizacji gałęzi, co pozwala pozostawić miejsce na ekranie na dane o commitach w repozytoriach z dużą liczbą gałęzi.


    * | | | | 619931f561 Scalanie gałęzi ‘dl/posix-unused-warning-clang’
    |\ \ \ \ \
    | * | | | ~ cf48887610 compat/posix.h: uproszczenie porównania GIT_GNUC_PREREQ()
    | * | | | ~ ffd45926dc compat/posix.h: czyszczenie GIT_GNUC_PREREQ() i UNUSED
    |\ \ \ \ \~
    | * | | | ~ 3f5203eeb4 ls-files: filtruj pathspec przed lstat

  • Do komend «git log» i «git rev-list» dodano opcję «—max-count-oldest=, która pozwala na wybranie N najstarszych commitów w zakresie.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster