Dostępny system kontroli źródła Git 2.41

Po trzech miesiącach prac wypuszczono rozproszony system kontroli źródła Git 2.41. Git to jeden z najpopularniejszych, niezawodnych i wydajnych systemów kontroli wersji, zapewniający elastyczne narzędzia do nieliniowego programowania oparte na rozgałęzianiu i łączeniu. Aby zapewnić integralność historii i odporność na zmiany wsteczne, w każdym zatwierdzeniu stosowane jest ukryte haszowanie całej poprzedniej historii, możliwe jest także certyfikowanie poszczególnych tagów i zatwierdzeń cyfrowymi podpisami programistów.

W porównaniu do poprzedniej wersji, nowa wersja zawierała 542 zmiany, przygotowane przy udziale 95 programistów, z czego 29 brało udział w tworzeniu po raz pierwszy. Główne innowacje:

  • Poprawiona obsługa nieosiągalnych obiektów, do których nie ma odniesień w repozytorium (do których nie odwołują się gałęzie ani znaczniki). Obiekty nieosiągalne są usuwane przez moduł zbierający elementy bezużyteczne, ale pozostają w repozytorium przez pewien czas, zanim zostaną usunięte, aby uniknąć sytuacji wyścigowych. Aby śledzić okres występowania obiektów nieosiągalnych, konieczne jest dołączenie do nich znaczników z czasem zmiany obiektów podobnych, co nie pozwala na przechowywanie ich w jednym pliku paczki, w którym wszystkie obiekty mają wspólny czas zmiany. Wcześniej każdy nieosiągalny obiekt był przechowywany w osobnym pliku, co prowadziło do problemów, gdy istniała duża liczba nowych, nieosiągalnych obiektów, które nie nadawały się jeszcze do usunięcia. W nowej wersji domyślnie do pakowania nieosiągalnych obiektów wykorzystywany jest mechanizm „cruft packs”, który pozwala na przechowywanie wszystkich nieosiągalnych obiektów w jednym pliku paczki, a dane o czasie modyfikacji każdego obiektu znajdują odzwierciedlenie w osobnej tabeli, przechowywanej w pliku z rozszerzeniem „.mtimes” i powiązanym za pomocą pliku indeksu z rozszerzeniem „.idx”.
    Dostępny system kontroli źródła Git 2.41
  • Utrzymywanie odwrotnego indeksu na dysku dla plików pakietu jest domyślnie włączone. Podczas testowania w repozytorium torvalds/linux użycie indeksu odwrotnego umożliwiło przyspieszenie operacji „git push” wymagających dużej ilości zasobów o 1.49 razy, a prostych operacji, takich jak obliczanie rozmiaru pojedynczego obiektu za pomocą „git cat- plik —batch='%(rozmiar obiektu:dysk)' "77 razy. Pliki („.rev”) z odwrotnym indeksem będą przechowywane w repozytorium w katalogu „.git/objects/pack”.

    Przypomnijmy, że Git przechowuje wszystkie dane w postaci obiektów, które znajdują się w oddzielnych plikach. Aby zwiększyć efektywność pracy z repozytorium, obiekty umieszczane są dodatkowo w plikach pack, w których informacja prezentowana jest w postaci strumienia obiektów następujących po sobie (podobny format stosowany jest przy przesyłaniu obiektów za pomocą git fetch i git push polecenia). Dla każdego pliku paczki tworzony jest plik indeksowy (.idx), który pozwala bardzo szybko określić przesunięcie w pliku paczki, w którym dany obiekt jest przechowywany za pomocą identyfikatora obiektu.

    Zawarty w nowej wersji indeks zwrotny ma na celu optymalizację procesu ustalania identyfikatora obiektu na podstawie informacji o umieszczeniu obiektu w pliku paczki. Wcześniej taka konwersja wykonywana była na bieżąco podczas analizowania pliku paczki i zapisywana była jedynie w pamięci, co nie pozwalało na ponowne wykorzystanie podobnych indeksów i wymuszało każdorazowe generowanie indeksu. Operacja budowania indeksu sprowadza się do zbudowania tablicy par pozycja-obiekt i posortowania jej według pozycji, co w przypadku dużych plików pakietów może zająć dużo czasu.

    Na przykład operacja wyświetlania zawartości obiektów wykorzystująca indeks bezpośredni była 62 razy szybsza niż operacja wyświetlania rozmiaru obiektów, dla której nie indeksowano danych dotyczących położenia obiektu. Po zastosowaniu indeksu odwrotnego operacje te zaczęły zajmować mniej więcej tyle samo czasu. Indeksy odwrotne umożliwiają także przyspieszenie operacji wysyłania obiektów podczas wykonywania poleceń pobierania i wypychania poprzez bezpośrednie przesyłanie gotowych danych z dysku.

    Dostępny system kontroli źródła Git 2.41

  • Protokół „pomocnika poświadczeń”, używany do przesyłania poświadczeń podczas uzyskiwania dostępu do repozytoriów z ograniczonym dostępem, dodał obsługę przekazywania nagłówków WWW-Authenticate pomiędzy modułem obsługi poświadczeń a usługą, w której przeprowadzane jest uwierzytelnianie. Obsługa nagłówka WWW-Authenticate umożliwia przekazywanie parametrów zakresu OAuth w celu bardziej szczegółowego rozdzielenia dostępu użytkowników do repozytoriów i wytyczenia zakresów dostępnych dla żądań.
  • Do polecenia for-each-ref dodano opcję formatowania „%(ahead-behind:”: )”, co pozwala na natychmiastowe uzyskanie informacji o liczbie zatwierdzeń obecnych lub nieobecnych w danej gałęzi w stosunku do innej gałęzi (o ile jedna gałąź jest za lub przed inną na poziomie zatwierdzenia). Wcześniej, aby uzyskać takie informacje, trzeba było uruchomić dwie osobne komendy: „git rev-list —count main..my-feature”, aby uzyskać liczbę zatwierdzeń unikalnych dla gałęzi oraz „git rev-list —count moja-feature ..main”, aby uzyskać liczbę brakujących zatwierdzeń. Teraz takie obliczenia można sprowadzić do jednego polecenia, co upraszcza pisanie procedur obsługi i skraca czas wykonania. Na przykład, aby pokazać gałęzie, które nie zostały scalone i ocenić, czy znajdują się za, czy przed swoją główną gałęzią, możesz użyć jednowierszowego formatu: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(przed-z tyłu:origin/HEAD)' \refs/heads/tb/ | kolumna -t tb/cruft-extra-tips 2 96 tb/for-each-ref — wyklucz 16 96 tb/roaring-bitmaps 47 3 zamiast wcześniej używanego skryptu, który działa 17 razy wolniej: $ git for-each-ref — format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | podczas czytania ref wykonaj z wyprzedzeniem="$(git rev-list -count Origin/HEAD..$ref)" za="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$naprzód" "$za" zrobione | kolumna -t tb/cruft-extra-tips 2 96 tb/for-each-ref — wyklucz 16 96 tb/roaring-bitmaps 47 3
  • Do polecenia „git fetch” dodano opcję „-porcelain”, jeśli jest określona, ​​dane wyjściowe są generowane w formacie „ ", mniej czytelny, ale wygodniejszy do analizowania w skryptach.
  • Dodano opcję „fetch.hideRefs”, która pozwala przyspieszyć operacje „git fetch” poprzez ukrycie części referencji w lokalnym repozytorium na etapie sprawdzania, czy serwer wysłał pełny zestaw obiektów, co pozwala zaoszczędzić czas ograniczenie kontroli jedynie do serwerów, z których bezpośrednio pobierane są dane. Na przykład podczas uruchamiania testu na systemie z repozytoriami zawierającymi dużą liczbę śledzonych linków zewnętrznych, z wyłączeniem wszystkich linków z wyjątkiem tych adresowanych do serwera docelowego, $remote skróciło wykonanie operacji git fetch z 20 minut do 30 sekund. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • Komenda „git fsck” zapewnia możliwość sprawdzenia korupcji, zgodności sum kontrolnych i poprawności wartości w mapach bitowych dostępności i indeksach odwrotnych.
  • Polecenie „git clone --local” wyświetla teraz błąd podczas próby kopiowania z repozytorium zawierającego dowiązania symboliczne w $GIT_DIR.

Źródło: opennet.ru

Dodaj komentarz