Après trois mois de développement, la version du système distribué de gestion de code source Git 2.36 a été publiée. Git est l'un des systèmes de gestion de versions les plus populaires, fiables et performants, offrant des outils flexibles de développement non linéaire basés sur des branches et des fusions. Pour garantir l'intégrité de l'historique et la résistance aux modifications « rétroactives », un hachage implicite de tout l'historique précédent est utilisé dans chaque commit. Il est également possible de certifier numériquement certaines balises et commits par les signatures des développeurs.
Comparé à la version précédente, cette nouvelle version intègre 717 modifications, préparées par 96 développeurs, dont 26 ont participé au développement pour la première fois. Les principales nouveautés incluent :
- La commande « git log » et « git show » a ajouté l'option « —remerge-diff », qui permet d'afficher les différences entre le résultat global de la fusion et les données réelles reflétées dans le commit après le traitement de la commande « merge », ce qui permet d'évaluer visuellement les modifications apportées à la suite de la résolution des conflits lors de la fusion. La commande habituelle « git show » sépare les différentes résolutions de conflit par une indentation, ce qui complique la compréhension des changements. Par exemple, sur la capture d'écran ci-dessous, les lignes « +/− » sans indentation montrent la dernière résolution de conflit liée au renommage de l'ancien sha1 en oid dans le commentaire, tandis que « +/− » avec indentation montre la résolution initiale du conflit causée par l'ajout d'un argument supplémentaire dans la fonction dwim_ref() dans la deuxième branche.

Lorsque l'option « —remerge-diff » est utilisée, les différences entre les résolutions de conflits ne sont pas séparées pour chaque branche parente, mais montrent les différences générales entre le fichier avec les conflits de fusion et le fichier dans lequel les conflits sont résolus.

- La flexibilité de la configuration du comportement de réinitialisation des caches disque via l'appel de la fonction fsync() a été augmentée. L'ancien paramètre core.fsyncObjectFiles a été divisé en deux variables de configuration, core.fsync et core.fsyncMethod, permettant d'appliquer fsync non seulement aux fichiers d'objets (.git/objects), mais également à d'autres structures git, telles que les références (.git/refs), reflog et fichiers pack.
Grâce à la variable core.fsync, il est possible de spécifier une liste de structures internes de Git pour lesquelles fsync sera appelé après l'opération d'écriture. La variable core.fsyncMethod permet de choisir la méthode de vidage du cache, par exemple, il est possible de choisir fsync pour appliquer l'appel système du même nom ou d'indiquer writeout-only pour appliquer un écriture différée (pagecache writeback).
- Pour se prémunir contre les vulnérabilités permettant à d'autres utilisateurs de manipuler les répertoires .git dans des partitions partagées, la vérification du propriétaire du dépôt a été renforcée. L'exécution de toutes les commandes git est désormais autorisée uniquement dans ses propres répertoires «.git». Si le répertoire du dépôt appartient à un autre utilisateur, une erreur sera par défaut générée. Ce comportement peut être désactivé via la configuration safe.directory.
- La commande «git cat-file», qui permet d'afficher le contenu brut des objets Git, a été dotée d'une option «—batch-command» qui complète les commandes «—batch» et «—batch-check» antérieurement disponibles, en ajoutant la possibilité de sélection adaptative du type de sortie à l'aide de «contents » pour afficher le contenu ou «info » pour afficher les informations relatives à l'objet. De plus, la commande «flush» est supportée pour vider le tampon de sortie.
- La commande «git ls-tree», destinée à générer une liste du contenu de l'arborescence des objets, a vu l'ajout de l'option «—oid-only» («—object-only»), analogique à «—name-only», qui ne renvoie que les identifiants des objets afin de faciliter les appels depuis des scripts. Une option «—format» a également été mise en œuvre pour définir un format de sortie personnalisé, combinant des informations sur le mode, le type, le nom et la taille.
- Dans la commande «git bisect run», l'étiquetage du script comme exécutable a été intégré, ce qui permet de générer des erreurs avec les codes 126 ou 127 dans ce cas (auparavant, si le script ne pouvait pas être lancé, toutes les révisions étaient marquées comme problématiques).
- La commande «git fetch» a été enrichie d'une option «—refetch» pour extraire tous les objets sans informer l'autre partie du contenu déjà présent sur le système local. Ce comportement peut être utile pour restaurer un état après des échecs, lorsqu'il n'y a pas de certitude sur l'intégrité des données locales.
- Les commandes «git update-index», «git checkout-index», «git read-tree» et «git clean» ont été ajoutées avec la prise en charge des index partiels (sparse index), permettant d'améliorer les performances et d'économiser de l'espace dans les dépôts où des opérations de clonage partiel (sparse-checkout) sont effectuées.
- Le comportement de la commande «git clone —filter=… —recurse-submodules» a été modifié, entraînant désormais un clonage partiel des sous-modules (auparavant, lors de l'exécution de telles commandes, le filtre ne s'appliquait qu'au contenu principal, et les sous-modules étaient clonés intégralement sans tenir compte du filtre).
- La commande «git bundle» a été mise à jour pour prendre en charge la spécification de filtres pour le contenu sélectif, analogiquement aux opérations de clonage partiel.
- La commande «git branch» a ajouté l'option «—recurse-submodules» pour un parcours récursif des sous-modules.
- Un nouveau gestionnaire pour le langage Kotlin a été proposé dans userdiff.
Source : opennet.ru


