Представен новият 2.37 ъпдейт на разпределената система за управление на изходния код Git. Git е една от най-популярните, надеждни и високопроизводителни системи за управление на версии, предлагаща гъвкави средства за нелинейно разработване, базирани на разклоняване и сливане на клонове. За осигуряване на целостта на историята и устойчивост на измененията „задним числом“ се използва неявно хеширане на цялата предходна история в всеки комит, също така е възможна удостоверяване чрез цифрови подписи на разработчиците за отделни тагове и комити.
Сравнено с предишния ъпдейт, новата версия включва 395 промени, подготвени с участието на 75 разработчици, от които 20 участват за първи път в разработката. Основните нововъведения:
- Доведена до готовност за широко използване механизма за частични индекси (sparse index), обхващающи само част от репозитория. Частичните индекси позволяват повишаване на производителността и спестяване на пространство в репозиториите, в които се извършват операции по частично клониране (sparse-checkout) или работа с непълна копия на репозитория. В новия ъпдейт е завършена работата по интеграцията на частичните индекси в командите „git show“, „git sparse-checkout“ и „git stash“. Най-забележимото подобрение в производителността от използването на частични индекси се наблюдава в командата „git stash“, чиято скорост на изпълнение в някои ситуации е увеличена с 80%.
- Реализиран е нов механизъм „cruft packs“ за опаковане на недостъпни обекти (unreachable), за които в хранилището липсват връзки (не се слагат референции от клонове или тагове). Недостъпните обекти се премахват от събирача на боклук, но преди това остават в хранилището за определено време, за да се избегнат условия на състезание. За проследяване на периода на съществуване на недостъпните обекти е необходима свързаност с тях чрез етикети с времето на промяна на подобни обекти, което не позволява да бъдат съхранявани в един pack-файл, в който всички обекти имат общо време на промяна. Предишният подход за съхранение на всеки обект в отделен файл водеше до проблеми при наличие на голям брой нови недостъпни обекти, които все още не подлежат на премахване. Предложеният механизъм „cruft packs“ позволява съхранение на всички недостъпни обекти в един pack-файл, докато данните за времето на модификация на всеки обект се отразяват в отделна таблица, съхранявана в файл с разширение „.mtimes“.
- За Windows и macOS е реализиран вграден механизъм за проследяване на промени в файловата система, който позволява да се избегне преглеждането на целия работен каталозив при изпълнение на операции като „git status“. По-рано, за проследяване на промени чрез hook-и, можеха да се свързват външни инструменти за проследяване на промени във файловата система, като Watchman, но това изискваше инсталиране на допълнителни програми и конфигуриране. Сега посочената функционалност е вградена и може да се активира с командата „git config core.fsmonitor true“.
- В командата „git sparse-checkout“ е обявена за остаряла поддръжката на алтернативния режим „—cone“ за метода на определяне на шаблони за частично клониране, който позволява при определянето на частта от хранилището, която подлежи на операцията по клониране, да се изброяват отделни файлове, използвайки синтаксиса на „.gitignore“, което не позволява оптимизация чрез частични индекси.
- Увеличена гибкость настройки вызова fsync() для сброса изменений на диск. В параметр «core.fsyncMethod» добавлена поддержка стратегии синхронизации «batch», которая позволяет ускорить процесс записи большого количества отдельных файлов, собирая изменения в кэше обратной записи и сбрасывая их одним вызовом fsync(). Тест, в котором с помощью команды «git add» было добавлено 500 файлов, при включенном новом режиме был выполнен за 0.15 секунды, тогда как при вызове fsync() для каждого файла потребовалось 1.88 секунды, а без использования fsync — 0.06 секунды.
- В команды обхода веток, такие как «git log» и «git rev-list», добавлена опция «—since-as-filter=X», позволяющая исключать информацию о коммитах, время создания которых старше «X». В отличие от опции «—since», новая команда реализована в виде фильтра, который не останавливает перебор после первого коммита, старше заданного времени.
- В команде «git remote» при указании флага «-v» теперь выводится информация о частичных клонах репозитория.
- Добавлена настройка «transfer.credentialsInUrl», которая может принимать значения «warn», «die» и «allow». Если в параметре «remote..url» указаны учётные данные в открытом текстовом формате, то выполнение операций «fetch» или «push» завершится ошибкой, если настройка «transfer.credentialsInUrl» примет значение «die», или предупреждением, если установлено значение «warn».
- По умолчанию внедрена новая реализация интерактивного режима команды «git add -i», переписанная с Perl на C.
Източник: opennet.ru
