Système de contrôle de source Git 2.41 disponible

Après trois mois de développement, la version du système de contrôle de source distribué Git 2.41 a été publiée. Git est l'un des systèmes de contrôle de version les plus populaires, les plus fiables et les plus performants qui fournit des outils de développement non linéaires flexibles basés sur la création de branches et la fusion de branches. 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é, il est également possible de vérifier les balises individuelles et les commits avec les signatures numériques des développeurs.

Par rapport à la version précédente, 542 modifications ont été acceptées dans la nouvelle version, préparée avec la participation de 95 développeurs, dont 29 ont participé au développement pour la première fois. Principales nouveautés :

  • Amélioration de la gestion des objets inaccessibles qui ne sont pas référencés dans le référentiel (les branches ou les balises ne sont pas référencées). Les objets inaccessibles sont supprimés par le ramasse-miettes, mais restent dans le référentiel pendant un certain temps avant d'être supprimés pour éviter les conditions de concurrence. Pour garder une trace de la période des objets inaccessibles, il est nécessaire de leur lier des étiquettes avec le temps de changement d'objets similaires, ce qui ne permet pas de les stocker dans un fichier pack, dans lequel tous les objets ont un temps de changement commun. Auparavant, chaque objet inaccessible était stocké dans un fichier séparé, ce qui entraînait des problèmes s'il y avait un grand nombre d'objets inaccessibles frais qui n'étaient pas encore soumis à la suppression. Dans la nouvelle version, par défaut, le mécanisme "cruft packs" est utilisé pour emballer les objets inaccessibles, ce qui permet de stocker tous les objets inaccessibles dans un fichier pack et de refléter les données sur l'heure de modification de chaque objet dans une table séparée stockée dans un fichier avec l'extension ".mtimes" et lié à l'aide d'un fichier d'index avec l'extension ".idx".
    Système de contrôle de source Git 2.41 disponible
  • Par défaut, le maintien d'un index inversé (revindex) sur le disque pour les fichiers de pack est activé. Lors d'un test sur les référentiels torvalds/linux, l'utilisation d'un index inversé nous a permis d'accélérer de 1.49 fois les opérations "git push" gourmandes en ressources, et les opérations simples, telles que le calcul de la taille d'un seul objet à l'aide de "git cat- file --batch='%(objectsize:disk)' » 77 fois. Les fichiers (".rev") avec un index inversé seront stockés dans le référentiel dans le répertoire ".git/objects/pack".

    Rappelons que Git stocke toutes les données sous forme d'objets, qui sont placés dans des fichiers séparés. Pour augmenter l'efficacité du travail avec le référentiel, les objets sont en outre placés dans des fichiers pack, dans lesquels les informations sont présentées sous la forme d'un flux d'objets se succédant (un format similaire est utilisé lors du transfert d'objets avec git fetch et git commandes push). Un fichier d'index (.idx) est créé pour chaque fichier pack, ce qui vous permet de déterminer très rapidement le décalage dans le fichier pack par lequel l'objet donné est stocké par l'identifiant de l'objet.

    L'index inversé inclus dans la nouvelle version vise à rationaliser le processus de détermination de l'ID d'objet à partir d'informations sur l'emplacement de l'objet dans le fichier pack. Auparavant, une telle conversion était effectuée à la volée lors de l'analyse du fichier pack et n'était stockée qu'en mémoire, ce qui ne permettait pas la réutilisation de tels index et obligeait à générer l'index à chaque fois. L'opération de construction d'un index est réduite à la construction d'un tableau de paires objet-position et à son tri par position, ce qui peut prendre beaucoup de temps pour les gros fichiers pack.

    Par exemple, l'opération d'affichage du contenu des objets, qui utilise un index direct, était 62 fois plus rapide que l'opération d'affichage de la taille des objets, pour laquelle les données de relation position-objet n'étaient pas indexées. Après avoir utilisé l'index inverse, ces opérations ont commencé à prendre à peu près le même temps. Les index inversés vous permettent également d'accélérer l'opération d'envoi d'objets lors de l'exécution de commandes d'extraction et d'envoi en transférant directement des données prêtes à l'emploi à partir du disque.

    Système de contrôle de source Git 2.41 disponible

  • Ajout de la prise en charge de la transmission des en-têtes WWW-Authenticate entre le gestionnaire d'informations d'identification et le service d'authentification au protocole "d'assistance aux informations d'identification" utilisé pour transmettre les informations d'identification lors de l'accès aux référentiels restreints. La prise en charge de l'en-tête WWW-Authenticate vous permet de transmettre des paramètres de portée OAuth pour séparer plus précisément l'accès des utilisateurs aux référentiels et délimiter les portées disponibles pour les requêtes.
  • Ajout de l'option de format "%(devant-derrière : )", ce qui vous permet d'obtenir immédiatement des informations sur le nombre de commits présents ou absents dans une certaine branche, par rapport à une autre branche (de combien une branche est en retard ou en avance sur une autre au niveau des commits). Auparavant, l'obtention de ces informations nécessitait deux commandes distinctes : "git rev-list --count main..my-feature" pour obtenir le nombre de commits uniques à une branche, et "git rev-list --count my-feature.. main" pour obtenir le nombre de commits manquants. Désormais, ces calculs peuvent être réduits à une seule instruction, ce qui simplifie l'écriture des gestionnaires et réduit le temps d'exécution. Par exemple, pour afficher les branches non fusionnées et évaluer si elles sont derrière ou devant leur branche principale, vous pouvez utiliser une ligne : $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(devant-derrière :origine/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3 au lieu du script précédemment utilisé, qui est 17 fois plus lent : $ git for-each-ref - format='%(refname:short)' --no-merged=origine/HEAD \ refs/heads/tb | while read ref do ahead="$(git rev-list --count origin/HEAD..$ref)" behind="$(git rev-list --count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$avant" "$derrière" terminé | colonne -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclure 16 96 tb/roaring-bitmaps 47 3
  • Ajout de l'option "--porcelain" à la commande "git fetch", qui génère une sortie au format " ”, moins lisible, mais plus pratique pour l'analyse dans les scripts.
  • Ajout du paramètre "fetch.hideRefs" pour accélérer les opérations "git fetch" en masquant une partie des liens dans le référentiel local au stade de la vérification que le serveur a envoyé l'ensemble complet des objets, ce qui permet de gagner du temps en limitant la vérification uniquement aux serveurs à partir duquel les données sont directement récupérées. Par exemple, lors d'un test sur un système avec des référentiels contenant un grand nombre de liens externes suivis, l'exclusion de tous les liens sauf ceux adressés au serveur cible $remote a réduit l'opération "git fetch" de 20 minutes à 30 secondes. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • La commande "git fsck" implémente la possibilité de vérifier la corruption, la correspondance de la somme de contrôle et l'exactitude des valeurs dans les bitmaps d'accessibilité et les index inversés.
  • La commande "git clone --local" affiche désormais une erreur lors de la tentative de copie à partir d'un référentiel contenant des liens symboliques dans $GIT_DIR.

Source: opennet.ru

Ajouter un commentaire