La sortie du système de gestion de version distribué Git 2.55 a été annoncée. Parmi les principales nouveautés : l'inclusion par défaut de la construction avec Rust, la mise en œuvre du processus fsmonitor pour Linux, une nouvelle stratégie de réemballage de l'index incrémental MIDX, la commande « git history fixup » pour corriger un commit, l'optimisation de la génération de cartes de disponibilité des objets, le support de l'exécution parallèle des hooks, ainsi que la commande « git format-rev ». Le code de Git est distribué sous la licence GPLv2+.
Comparé à la version précédente, cette nouvelle version intègre 505 changements, préparés avec la participation de 100 développeurs, dont 33 ont participé pour la première fois au développement de Git. Les principales nouveautés (1, 2, 3) :
- Le support des composants en langage Rust est activé par défaut. Le compilateur rustc
ajouté aux dépendances de construction. Pour une construction sans Rust, vous pouvez utiliser le drapeau « NO_RUST=1 » lors de l'exécution de l'outil make ou « -Drust=disabled » lors de l'exécution de « meson configure ». La possibilité de désactiver la construction avec Rust sera maintenue jusqu'à la branche Git 3.0, où Rust sera inclus en tant que dépendance obligatoire. Une couche en Rust a été mise en œuvre pour la portabilité entre les configurations avec des hachages SHA-1 et SHA-256, ainsi que certaines fonctions internes, telles que l'encodage et le décodage de valeurs entières à longueur variable. À l'avenir, une refonte en Rust d'autres composants internes significatifs de Git est attendue. - Une opération « git history fixup » a été ajoutée à l'équipe expérimentale « git history », fournissant des capacités pour réécrire l'historique des modifications. L'opération « fixup » permet de transférer les modifications ajoutées via « git add » vers un commit antérieur et de réécrire automatiquement tous les commits suivants comme si vous aviez exécuté la commande « git commit —fixup=<commit> » suivie de « git rebase —autosquash <commit>~ ».
- Un processus en arrière-plan fsmonitor a été mis en œuvre pour la plateforme Linux, permettant de suivre les changements dans le système de fichiers à l'aide du mécanisme inotify et d'éviter de parcourir l'ensemble du répertoire de travail lors de l'exécution de commandes telles que « git status ». L'activation se fait via la configuration « core.fsmonitor ».
- La commande « git repack » a introduit le mode « —write-midx=incremental », qui met en œuvre une nouvelle stratégie de mise à jour des métadonnées dans l'index MIDX incrémental (multi-pack index), permettant de ne pas avoir à réemballer l'ensemble de l'index. Dans l'index multi-pack incrémental, au lieu d'un grand index contenant des informations sur la répartition des objets dans les fichiers de pack, une séparation en couches est appliquée : chaque couche couvre un certain nombre de fichiers de pack et est stockée dans un fichier bitmap distinct. Cette structure permet d'ajouter des données sur les objets dans de nouveaux fichiers de pack à l'index, en attachant de nouvelles couches à l'index sans reconstruire les couches existantes.
La commande « git repack —write-midx=incremental » permet d'ajouter une nouvelle couche à l'index MIDX incrémental, couvrant les fichiers de pack récemment créés. Associée au mode d'emballage de dépôts « —geometric », cette nouvelle commande permet de combiner de nouveaux objets provenant de plusieurs fichiers de pack en un seul fichier de pack plus grand et, si nécessaire, d'effectuer l'emballage et la fusion de plusieurs couches voisines de l'index MIDX incrémental. Cette stratégie permet, lors de l'exécution de « git repack », de ne réécrire que les couches supérieures, laissant les anciennes grandes couches intactes, et d'éviter une croissance incontrôlée de la chaîne de couches, maintenant le nombre total de couches à un niveau proportionnel au logarithme du nombre total d'objets.
- La génération de bitmaps de disponibilité des objets a été considérablement optimisée grâce à un nouvel algorithme de parcours de l'arbre d'objets, excluant la récursion excessive, le stockage en cache des positions des objets, le tri des bitmaps avant leur combinaison par l'opération XOR, et la refonte du code pour créer des bitmaps de pseudo-fusion (pseudo-merge). Dans le dépôt de test, les optimisations ont permis de réduire le temps de génération des bitmaps de 612 à 294 secondes.
- La possibilité d'exécuter des hooks indépendants en parallèle dans les fichiers de configuration a été mise en œuvre. Les hooks qui affectent l'état partagé ou en tiennent compte, tels que ceux qui modifient les notes de commit ou inspectent les index et l'arborescence de travail, ne peuvent pas être lancés simultanément. Cependant, il est possible d'exécuter simultanément des hooks pour la vérification avec un linter et l'exécution de tests unitaires. Les hooks qui permettent une exécution parallèle se configurent via le paramètre « hook.nom_du_hook.parallel = true ». Le nombre de travaux exécutés simultanément est déterminé par la configuration hook.jobs, hook..jobs ou l'option de ligne de commande « -j ».
- La commande « git pack-objects —path-walk » permet désormais de spécifier des filtres tels que « blob:none », « blob:limit= », « tree:0 », « object:type= », « sparse: » et « combine: ». Dans un test réalisé, le rejet des blobs lors de l'exécution de « —path-walk » a permis de réduire la taille du pack fichier de 16%.
- Ajoutée la commande « git format-rev » pour formater les révisions et les noms d'objets mentionnés dans les listes de commits ou rencontrés dans un texte libre (par exemple, cela peut être utilisé dans des hooks pour traiter les notes de commit).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- L'échappement de la plupart des séquences de contrôle du terminal dans les messages d'information et le texte des erreurs transmis est activé par défaut. serveurLorsqu'il s'agit de code malveillant, serveur de telles séquences d'échappement pouvaient être utilisées pour masquer ou modifier la sortie, par exemple, à l'aide de séquences d'échappement pour déplacer le curseur et effacer le texte. Le support des séquences d'échappement pour la mise en surbrillance des éléments en couleur a été conservé.
- La commande « git checkout -m » sauvegarde désormais automatiquement les modifications locales conflictuelles dans la zone de stash sans nécessiter la résolution immédiate du conflit.
- Dans la commande « git push », la possibilité d'envoyer une branche vers plusieurs serveurs Git externes en une seule commande a été ajoutée. Par exemple, pour transférer la branche main non seulement vers le serveur principal, mais aussi vers des miroirs, vous pouvez créer un groupe « publish » composé de serveurs « github », « gitlab » et « mirror » :
git config remotes.publish « github gitlab mirror »
git push publish main - La commande « git log —graph » a été ajoutée avec l'option « —graph-lane-limit= » pour limiter le nombre de bandes verticales lors de la visualisation des branches, ce qui permet de laisser de l'espace à l'écran pour les informations sur les commits dans les dépôts avec un grand nombre de branches.
…
* | | | | 619931f561 Fusionner la branche ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h : simplifier la comparaison GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h : nettoyer GIT_GNUC_PREREQ() et UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files : filtrer le pathspec avant lstat - Les commandes « git log » et « git rev-list » ont été ajoutées avec l'option « —max-count-oldest= », permettant de sélectionner les N commits les plus anciens dans la plage.
Source : opennet.ru
