Résumé:
Git du pack fichiers sont soigneusement construits pour utiliser efficacement les caches et
fournir "gentil" modèles d'accès pour les commandes courantes et pour la lecture récemment référencé
objets.
Git du fichier de pack
le format est assez souple (voir Documentation/technical/pack-format.txt,
ou La Packfile dans Le Git Community Book).
Les fichiers de pack de stocker des objets dans les deux principaux
moyens: "undeltified" (prendre les premières données de l'objet et dégonfler-compresser
c'), ou "deltified" (la forme d'un delta contre un autre objet, puis
dégonflez-compresser le résultant delta de données). Les objets stockés dans
un pack peut être dans n'importe quel ordre (ils ne sont pas (nécessairement) être
triée par type d'objet, nom de l'objet, ou tout autre attribut) et
deltified objets peuvent être faites à l'encontre de tout autre objet du même type.
Git est un pack d'objets de commande utilise plusieurs heuristiquespour
fournir un excellent localité de référence pour les communes
commandes. Ces heuristiques de contrôler à la fois la sélection de la base
objets pour deltified objets et l'ordre des objets. Chaque
mécanisme pour la plupart indépendants, mais ils partagent certains objectifs.
Git ne former de longues chaînes de delta objets compressés, mais l'
heuristiques essayer de faire en sorte que seuls les "vieux" objets se trouvent aux extrémités de
les longues chaînes. Le delta de la base de cache (qui est contrôlé par le
core.deltaBaseCacheLimit
variable de configuration) est automatiquement
utilisé et peut réduire considérablement le nombre de "reconstruit" nécessaire pour
les commandes qui ont besoin de lire un grand nombre d'objets (par exemple, git log
-p
).
Compression Delta Heuristique
Typique d'un dépôt Git stocke un très grand nombre d'objets, de sorte
il ne peut pas raisonnablement comparer tous à trouver les paires (et
les chaînes), ce qui rapportera le plus petit delta représentations.
Le delta de la base de sélection heuristique est basée sur l'idée que l'
bonne delta bases sera trouvé entre les objets avec les mêmes noms de fichiers
et de tailles. Chaque type d'objet est traitée séparément (c'est à dire un
objet d'un type ne sera jamais utilisé comme la base de delta pour une
objet d'un autre type).
Pour l'application du delta de la base de sélection, les objets sont triés (principalement) par
nom de fichier et la taille. Une fenêtre dans cette liste triée est utilisé pour limiter l'
le nombre d'objets qui sont considérés comme de possibles delta bases.
Si une "bonne"1 delta de la représentation n'est pas trouvée pour un objet
parmi les objets à sa fenêtre, alors l'objet ne sera pas delta
compressé.
La taille de la fenêtre est contrôlée par l' --window=
option de
git pack-objects
, ou l' pack.window
variable de configuration. L'
profondeur maximale d'une chaîne delta est contrôlée par l' --depth=
option d' git pack-objects
, ou l' pack.depth
configuration
variable. L' --aggressive
option de git gc
considérablement agrandit
à la fois la taille de la fenêtre et de la profondeur maximale pour tenter de créer
un petit pack de fichier.
Le nom de fichier de tri touffes ensemble les objets pour les entrées avec
des noms identiques (ou au moins similaire fins (par exemple, .c
)). La taille
le tri est de la plus grande à la plus petite, de sorte que les deltas à la suppression des données sont
préféré deltas qui ajoutent des données (depuis le retrait des deltas ont plus court
les représentations) et de sorte que le plus tôt, d'objets de taille (généralement
une version plus récente) ont tendance à être représenté avec la plaine de compression.
1
Ce qui constitue une "assez bonne" dépend de la taille de l'objet en question et de son potentiel de base de delta ainsi que la profondeur de ses delta de la chaîne.
Objet De La Commande Heuristique
Les objets sont stockés dans les fichiers du pack dans une "plus récemment référencé"
ordre. Les objets nécessaires à la reconstruction de l'histoire la plus récente sont
placé plus haut dans le pack, et ils seront rapprochés. Cette
fonctionne généralement bien pour les OS de caches.
Tous les commettre les objets sont triés par commettre date (les plus récents en premier)
et stockés ensemble. Ce placement et de commande optimise le disque
les accès nécessaires à la marche de l'histoire graphique et de l'extrait de base de commettre
de l'information (par exemple, git log
).
L'arbre et les objets blob sont stockés en commençant par l'arbre de la
tout d'abord stockées (la plus récente) s'engager. Chaque arbre est traité en profondeur
première de la mode, de ranger tous les objets qui n'ont pas déjà été
stockée. Cela met tous les arbres et les gouttes nécessaires pour reconstruire
la plus récente s'engager ensemble dans un seul endroit. Les arbres et les objets blob
n'ont pas encore été enregistrés, mais qui sont nécessaires pour des commits sont
stocké à côté, dans le triées en ordre de validation.
L'objet final de la commande est légèrement affectée par le delta de la base de sélection
si un objet est sélectionné pour le delta de la représentation et de son objet de base
n'a pas été sauvegardé, puis son objet de base est stockée immédiatement avant la
deltified objet lui-même. Cela empêche probablement le disque le cache en raison de la
non-linéaire d'accès nécessaire à la lecture d'un objet de base qui auraient "naturellement" été
stockées plus tard dans le fichier de pack.