Выпуск системы управления исходными текстами Git 2.36

После трёх месяцев разработки опубликован выпуск распределенной системы управления исходными текстами Git 2.36. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям “задним числом” используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.

По сравнению с прошлым выпуском в новую версию принято 717 изменений, подготовленные при участии 96 разработчиками, из которых 26 впервые приняли участие в разработке. Основные новшества:

  • В команды “git log” и “git show” добавлена опция “–remerge-diff”, позволяющая показать отличия между общим результатом слияния и фактическими данными, отражёнными в коммите после обработки команды “merge”, что позволяет наглядно оценить изменения, выполненные в результате разрешения конфликтов при слиянии. Обычная команда “git show” разделяет разные разрешения конфликтов отступом, что затрудняет понимание изменений. Например, на скриншоте ниже строки “+/-” без отступа показывает последнее разрешение конфликта, связанное с переименованием в первой ветке sha1 на oid в комментарии, а “+/-” с отступом – начальное разрешение конфликта, вызванное появлением во второй ветке дополнительного аргумента в функции dwim_ref().

    При использовании опции “–remerge-diff” различия между разрешениями конфликтов не разделяются для каждой родительской ветки, а показываются общие различия между файлом, имеющим конфликты слияния, и файлом, в котором конфликты решены.

  • Повышена гибкость настройки поведения по сбросу дисковых кэшей через вызов функции fsync(). Ранее доступный параметр core.fsyncObjectFiles разделён на две переменных конфигурации core.fsync и core.fsyncMethod, предоставляющих возможность применять fsync, не только к файлам с объектами (.git/objects), но и к другим структурам git, таким как ссылки (.git/refs), reflog и pack-файлы.

    Через переменную core.fsync можно указать список внутренних структур Git, после операции записи для которых дополнительно будет вызываться fsync. Переменная core.fsyncMethod позволяет выбрать метод для сброса кэша, например, можно выбрать fsync для применения одноимённого системного вызова или указать writeout-only для применения отложенной записи (pagecache writeback).

  • Для защиты от уязвимостей, манипулирующих подстановкой другими пользователями каталогов .git в совместно используемые разделы, усилена проверка владельца репозитория. Выполнение любых команд git теперь допускается только в своих каталогах “.git”. Если каталог с репозиторием принадлежит другому пользователю, то по умолчанию будет выведена ошибка. Указанное поведение можно отключить при помощи настройки safe.directory.
  • В команду “git cat-file”, предназначенную для вывода исходного содержимого Git-объектов, добавлена опция “–batch-command”, дополняющая ранее доступные команды “–batch” и “–batch-check” возможностью адаптивного выбора типа вывода через указание “contents ” для вывода содержимого или “info ” для вывода информация об объекте. Дополнительно поддерживается команда “flush” для сброса буфера вывода.
  • В команду “git ls-tree”, предназначенную для формирования списка содержимого дерева объектов, добавлена опция “–oid-only” (“–object-only”), по аналогии с “–name-only” выводящая только идентификаторы объектов для упрощения вызова из скриптов. Также реализована опция “–format” позволяющая определить собственный формат вывода, комбинируя информацию о режиме, типе, имени и размере.
  • В команде “git bisect run” реализовано определение невыставления
    для скрипта признака исполняемого файла и вывода в этом случае ошибок с кодами 126 или 127 (ранее, если скрипт невозможно было запустить все ревизии помечались как имеющие проблемы).
  • В команду “git fetch” добавлена опция “–refetch” для извлечения всех объектов без информирования другой стороны о содержимом, уже имеющемся на локальной системе. Подобное поведение может быть полезным для восстановления состояния после сбоев, когда нет уверенности в целостности локальных данных.
  • В команды “git update-index”, “git checkout-index”, “git read-tree” и “git clean” добавлена поддержка частичных индексов (sparse index), позволяющих повысить производительность и сэкономить место в репозиториях, в которых выполняются операции частичного клонирования (sparse-checkout).
  • Изменено поведение команды “git clone –filter=… –recurse-submodules”, которая теперь приводит к частичному клонированию субмодулей (ранее при выполнении подобных команд фильтр применялся только к основному содержимому, а субмодули клонировались полностью без учёта фильтра).
  • В команде “git bundle” добавлена поддержка указания фильтров для выборочного помещения содержимого по аналогии с операциями частичного клонирования.
  • В команду “git branch” добавлена опция “–recurse-submodules” для рекурсивного обхода субмодулей.
  • В userdiff предложен новый обработчик для языка Kotlin.
Release. Ссылка here.