Представен новият релиз на разпределената система за управление на изходния код Git 2.37. Git е една от най-популярните, надеждни и високопроизводителни системи за контрол на версиите, предлагаща гъвкави средства за нелинейно разработване, основаващи се на разклонение и сливане на клонове. За да се осигури цялостността на историята и устойчивостта на промените „обратно във времето“, се използва неявно хеширане на цялата предишна история във всеки комит, също така е възможно удостоверяване с цифрови подписи на разработчиците на отделни тагове и комити.
В сравнение с предишния release новата версия включва 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
