
Przedstawiony wydanie systemu rozproszonego zarządzania kodem źródłowym Git 2.55. Wśród kluczowych zmian: domyślne włączenie kompilacji z Rust, realizacja procesu fsmonitor dla systemu Linux, nowa strategia ponownego pakowania inkrementalnego indeksu MIDX, polecenie git history fixup do poprawy commitów, optymalizacja generacji bitmap dostępności obiektów, wsparcie dla równoległego wykonywania hooków, polecenie git format-rev. Kod Git rozpowszechniany na licencji GPLv2+.
W porównaniu do poprzedniej wersji, w nowej wersji przyjęto 505 zmian, przygotowanych we współpracy z 100 programistami, z których 33 po raz pierwszy wzięło udział w tworzeniu Git.
Główne nowości (github.blog, gitlab.com/blog, gitlab.com/git-scm):
- Domyślnie wliczona wsparcie dla komponentów w języku Rust. Kompilator rustc dodano wśród zależności budowlanych. Do kompilacji bez Rust można użyć flagi NO_RUST=1 podczas uruchamiania narzędzia make lub -Drust=disabled przy wykonywaniu meson configure. Możliwość wyłączenia kompilacji z Rust będzie wspierana do gałęzi Git 3.0, w której Rust zostanie włączono wśród obowiązkowych zależności. W języku Rust zaimplementowano warstwę do przenośności pomię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 zmiennej długości. W przyszłości spodziewana jest przeróbka bardziej znaczących komponentów wewnętrznych Git w Rust.
- Do eksperymentalnej komendy "git history", która oferuje możliwości do przepisania historii zmian, dodano operację „git history fixup” do poprawy commitów. Operacja fixup pozwala przenieść zmiany dodane przez git add do wcześniejszego commita i automatycznie przepisać wszystkie kolejne commity na podobieństwo wykonywania polecenia git commit —fixup= i uruchamiania git rebase —autosquash ~.
- Dla platformy Linux zrealizowano proces w tle fsmonitor, śledzący zmiany w systemie plików za pomocą mechanizmu inotify i pozwalający ominąć przeszukiwanie całego katalogu roboczego podczas wykonywania takich poleceń jak git status. Włączenie odbywa się poprzez ustawienie „core.fsmonitor».
- Do zespołu git repack dodano tryb —write-midx=incremental, wprowadzający nową strategię aktualizacji metadanych w inkrementalnym indeksie MIDX (multi-pack index), co pozwala na unikanie całkowitego przeładowania indeksu. W inkrementalnym indeksie multi-pakietowym zamiast jednego dużego indeksu, zawierającego informacje o rozmieszczeniu obiektów w plikach pakietów, stosuje się podział na warstwy — każda warstwa obejmuje określoną liczbę plików pakietów i jest przechowywana w osobnym pliku bitmapy. Taka struktura pozwala na dodawanie do indeksu danych o obiektach w nowych plikach pakietów, dołączając nowe warstwy do indeksu bez przebudowy już istniejących warstw. Komenda git repack —write-midx=incremental umożliwia dodanie do inkrementalnego indeksu MIDX nowej warstwy, obejmującej niedawno utworzone pliki pakietów. W połączeniu z trybem pakowania repozytoriów —geometric nowa komenda umożliwia połączenie nowych obiektów z kilku plików pakietów w jeden większy plik pakietu i w razie potrzeby przeprowadzenie pakowania oraz scalania kilku sąsiednich warstw inkrementalnego indeksu MIDX. Taka strategia pozwala podczas wykonywania git repack na przepisywanie tylko górnych warstw, pozostawiając stare duże warstwy nietknięte, a także wyklucza niekontrolowany wzrost łańcucha warstw, utrzymując całkowitą 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, eliminującemu zbędną rekurencję, buforowaniu pozycji obiektów, sortowaniu bitmap przed ich połączeniem operacją XOR oraz przeróbce kodu do tworzenia bitmapy pseudo-scalania (pseudo-merge). W badanym repozytorium optymalizacje pozwoliły skrócić czas generacji bitmap z 612 do 294 sekund.
- Wdrożono możliwość równoległego wykonywania niezależnych hooków W plikach konfiguracyjnych. Równocześnie nie mogą być uruchamiane haki, które wpływają na stan współdzielony lub go uwzględniają, na przykład zmieniające komentarze do commitów lub badające indeksy i drzewo robocze. Można natomiast równocześnie uruchamiać haki do sprawdzania lintem i realizacji testów jednostkowych. Haki dopuszczające równoległe wykonanie są konfigurowane za pomocą parametru hook.imię_huka.parallel = true. Liczba jednocześnie uruchamianych zadań jest określana przez ustawienie hook.jobs, hook..jobs lub opcję linii poleceń -j.
- W zespole git pack-objects —path-walk wprowadzono możliwość podawania filtrów, takich jak blob:none, blob:limit=, tree:0, object:type=, sparse: i combine:. W przeprowadzonym teście odrzucenie blobów podczas wykonywania —path-walk pozwoliło na 16% zmniejszenie rozmiaru utworzonego pliku pakietu.
- Dodano polecenie git format-rev do formatowania rewizji i nazw obiektów, które są wymieniane w listach commitów lub pojawiają się w dowolnym tekście (na przykład można je wykorzystać w hakach do przetwarzania komentarzy do commitów).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Zostało domyślnie włączone uciekanie większości sekwencji kontrolnych terminala w komunikatach informacyjnych i w tekstach błędów przesyłanych przez serwer. Podczas kontaktu z złośliwym serwerem takie sekwencje escape mogły być używane do ukrywania lub modyfikacji wyjścia, na przykład za pomocą sekwencji escape do przesuwania kursora i czyszczenia tekstu. Zachowano wsparcie dla sekwencji escape do podświetlania elementów kolorem.
- Polecenie git checkout -m teraz automatycznie zapisuje konfliktowe lokalne zmiany w obszarze stash bez potrzeby natychmiastowego rozwiązywania konfliktu.
- Do polecenia git push dodano możliwość umieszczania gałęzi na kilku zewnętrznych serwerach Git jednym poleceniem. Na przykład, aby przesłać gałąź main nie tylko na główny serwer, ale także na lustra, można utworzyć grupę publish składającą się z serwerów github, gitlab i mirror:
git config remotes.publish "github gitlab mirror"
git push publish main
- Do polecenia git log —graph dodano opcję —graph-lane-limit= w celu ograniczenia liczby poziomych pasków przy wizualizacji gałęzi, co pozwala na pozostawienie miejsca na ekranie pod 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 poleceń git log i git rev-list dodano opcję —max-count-oldest=, umożliwiającą wybór N najstarszych commitów w zakresie.
Źródło: linux.org.ru
