La sortie du système de contrôle de source distribué Git 2.37 a été annoncée. Git est l'un des systèmes de contrôle de versions les plus populaires, les plus fiables et les plus performants, fournissant des outils de développement non linéaires flexibles basés sur le branchement et la fusion. Pour garantir l'intégrité de l'historique et la résistance aux modifications rétroactives, un hachage implicite de l'intégralité de l'historique précédent dans chaque commit est utilisé, et il est également possible de certifier des balises et des commits individuels avec les signatures numériques des développeurs.
Par rapport à la version précédente, 395 modifications ont été adoptées dans la nouvelle version, préparée avec la participation de 75 développeurs, dont 20 ont participé au développement pour la première fois. Principales innovations :
- Le mécanisme des index partiels (sparse index), couvrant seulement une partie du référentiel, a été mis à disposition pour une utilisation généralisée. Les index partiels peuvent améliorer les performances et économiser de l'espace dans les référentiels qui effectuent des opérations de clonage partiel (sparse-checkout) ou qui fonctionnent avec une copie incomplète du référentiel. La nouvelle version complète l'intégration des index partiels dans les commandes git show, git sparse-checkout et git stash. L'avantage de performance le plus notable lié à l'utilisation d'index partiels est visible avec la commande git stash, qui a permis d'augmenter de 80 % la vitesse d'exécution dans certaines situations.
- Un nouveau mécanisme de « cruft packs » a été implémenté pour compresser les objets inaccessibles qui ne sont pas référencés dans le référentiel (non référencés par des branches ou des balises). Les objets inaccessibles sont supprimés par le garbage collector, mais restent dans le référentiel pendant un certain temps avant d'être supprimés pour éviter les conditions de concurrence. Pour suivre la période d'apparition d'objets inaccessibles, il est nécessaire de leur attacher des balises avec l'heure de changement d'objets similaires, ce qui ne permet pas de les stocker dans un fichier pack dans lequel tous les objets ont une heure de changement commune. Auparavant, l'enregistrement de chaque objet dans un fichier distinct entraînait des problèmes lorsqu'il y avait un grand nombre d'objets récents et inaccessibles qui n'étaient pas encore éligibles à la suppression. Le mécanisme proposé « cruft packs » vous permet de stocker tous les objets inaccessibles dans un seul fichier pack et de refléter les données sur l'heure de modification de chaque objet dans un tableau séparé stocké dans un fichier avec l'extension « .mtimes ».
- Pour Windows et macOS, il existe un mécanisme intégré pour suivre les modifications apportées au système de fichiers, vous permettant d'éviter d'itérer sur l'intégralité du répertoire de travail lors de l'exécution d'opérations telles que « git status ». Auparavant, pour suivre les modifications, des utilitaires externes permettant de suivre les modifications dans le FS, tels que Watchman, pouvaient être connectés via des hooks, mais cela nécessitait l'installation de programmes et de configurations supplémentaires. Désormais, la fonctionnalité spécifiée est intégrée et peut être activée avec la commande « git config core.fsmonitor true ».
- Dans la commande « git sparse-checkout », le support d'une alternative au mode « —cone », la méthode de définition de modèles de clonage partiel, a été déclaré obsolète, ce qui permet, lors de la détermination de la partie du référentiel qui est soumise à l'opération de clonage, pour lister les fichiers individuels en utilisant la syntaxe « .gitignore », qui ne permet pas d'utiliser des index partiels pour l'optimisation.
- Flexibilité accrue dans la configuration de l'appel fsync() pour vider les modifications sur le disque. La prise en charge de la stratégie de synchronisation « batch » a été ajoutée au paramètre « core.fsyncMethod », ce qui permet d'accélérer le travail lors de l'écriture d'un grand nombre de fichiers individuels en accumulant les modifications dans le cache d'écriture, qui est réinitialisé par un seul fsync(). appel. Le test, qui a abouti à l'ajout de 500 fichiers à l'aide de la commande « git add », s'est terminé en 0.15 seconde lorsque le nouveau mode a été activé, tandis que l'appel de fsync() a pris 1.88 seconde pour chaque fichier, et sans utiliser fsync - 0.06 seconde.
- Les commandes de traversée de branche comme « git log » et « git rev-list » ont désormais une option « -since-as-filter=X » qui vous permet de filtrer les informations sur les commits plus anciens que « X ». Contrairement à l'option « - depuis », la nouvelle commande est implémentée comme un filtre qui n'arrête pas la recherche après le premier commit plus ancien que l'heure spécifiée.
- Dans la commande « git remote », lors de la spécification de l'indicateur « -v », des informations sur les clones partiels du référentiel sont affichées.
- Ajout du paramètre "transfer.credentialsInUrl", qui peut prendre les valeurs "warn", "die" et "allow". Si spécifié dans le paramètre « remote. .url", toute tentative d'exécution d'une opération "fetch" ou "push" échouera avec une erreur si le paramètre "transfer.credentialsInUrl" est défini sur "die", ou un avertissement s'il est défini sur "warn".
- Par défaut, la nouvelle implémentation du mode interactif de la commande « git add -i », réécrite de Perl en C, est activée.
Source: opennet.ru
