След два месеца разработка, е публикувана версия на разпределената система за управление на изходните текстове Git 2.39. Git е една от най-популярните, надеждни и високопроизводителни системи за управление на версии, предоставяща гъвкави средства за нелинейна разработка, базирани на разклоняване и сливане на клонове. За да се осигури целостта на историята и устойчивостта към промени „задна дата“, се използва неявно хеширане на цялата предишна история в всеки комит, а също така е възможно удостоверяване с цифрови подписи на разработчици за отделни тагове и комити.
В сравнение с предишната версия, в новата версия са приети 483 промени, подготвени с участието на 86 разработчици, от които 31 участва за първи път в разработката. Основни нововъведения:
- В командата „git shortlog“, предназначена за показване на обобщения със статистики от историята на промените, е добавена опцията „—group“ за произволна групировка на комити по полета, неограничени до автора или комитера. Например, за показване на списък на разработчиците с информация за броя на промените, включваща помощниците, споменати в полето „Co-authored-by“, може да се използва командата: git shortlog -ns —group=author —group=trailer:co-authored-by
Изходният shortlog може да се агрегира с помощта на спецификаторите за форматиране, а опцията «—group» значително опростява създаването на сложни отчети и позволява да се избегне изпълнението на допълнителни команди за сортиране. Например, за създаване на отчет с информация за това колко комита за дадена версия са приети през всеки месец, можете да укажете: git shortlog v2.38.0.. —date=’format:%Y-%m’ —group=’’ -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=’’ | sort | uniq -c
- Разширени са възможностите на механизма «cruft packs», предназначен за опаковане на недостижими обекти, за които в хранилището липсват връзки (никоя клон или етикет не се позовава на тях). Недостижимите обекти биват премахвани от сборщика на боклук, но преди изтриване остават в хранилището за ограничен период, за да се изключат състояния на състезание. Механизмът «cruft packs» позволява съхранението на всички недостижими обекти в един pack файл, а информацията за времето на модификация на всеки обект да се отразява в отделна таблица, съхранявана в отделен файл с разширение «.mtimes», за да не се пресичат с общото време за промяна.
Времето на присъствие на недостижими обекти в хранилището преди фактическото им изтриване се определя от опцията «—prune=». Въпреки че забавянето преди изтриването е доста ефективен и практичен метод за предотвратяване на повреждане на хранилището поради състояния на състезание, то не е на 100% надеждно. За да се опрости възстановяването на повредено хранилище, в новата версия е предоставена възможност за запазване на липсващите обекти. За тази цел в командата «git repack» е добавена опция «—expire-to», която позволява определянето на файл за създаване на външна копия на всички изтривани обекти. Например, за запазване в файла backup.git на недостижимите обекти, които не са се променяли последните 5 минути, можете да използвате командата: git repack —cruft —cruft-expiration=5.minutes.ago -d —expire-to=../backup.git
- Скоростта на изпълнение на операцията «git grep —cached» при търсене в области, в които се прилага частично клониране (sparse-checkout) и за които съществуват частични индекси (sparse index), е значително увеличена (до 70%). Преди, при задаване на опцията «—cached», търсенето първоначално се осъществяваше в обикновения индекс, а след това в частичните, което водеше до забележими закъснения при търсене в големи хранилища.
- Ускорено е изпълнението на сървър проверки на свързаността на новите обекти преди тяхното поставяне в хранилището при изпълнение на операцията «git push». Благодарение на преминаването към вземане под внимание само на обявените връзки, в тестово хранилище с 7 млн. връзки, от които само 3% са покрити от операцията push, внесените оптимизации позволиха да се съкрати времето за проверка с 4.5 пъти.
- За защита от потенциални цели числови преливания в кода, е ограничен максималният размер на обработваните пачове в екипа „git apply“. В случай, че размерът на пача надвишава 1 ГБ, сега ще бъде изведена грешка.
- За защита от потенциални уязвимости са направени промени за почистване на излишната информация от заглавията, задавани при използване на модула h2h3 с опцията GIT_TRACE_CURL=1 или GIT_CURL_VERBOSE=1 заедно с HTTP/2.
- При извършване на операция check out с клон, който е символична връзка към друг клон, командата „git symbolic-ref HEAD“ сега извежда името на целевия клон, а не името на символичната връзка.
- Добавена е поддръжка на аргумента @{-1} в опциите „—edit-description“ („git branch —edit-description @{-1}“) за редактиране на описанието на предишния клон.
- Добавена е команда „git merge-tree —stdin“, позволяваща предаване на списък с параметри през стандартния входен поток.
- В мрежовите файлови системи по подразбиране е деактивиран обработчикът fsmonitor, следящ промените в файловата система.
Източник: opennet.ru
