Est le git diff binaire de l'algorithme (delta de stockage) standardisé?
Git utilise une compression delta de stocker des objets qui sont semblables les uns-les autres.
Est cet algorithme normalisé et utilisés dans d'autres outils? Est-il une documentation décrivant le format? Est-il compatible avec xdelta/VCDIFF/RFC 3284?
Vous devez vous connecter pour publier un commentaire.
Je pense que la diff algo utilisé pour pack de fichiers était liée à l'un des delta encodage là: dans un premier temps (2005) xdelta, puis libXDiff.
Mais alors, comme détaillé ci-dessous, il est passé à une implémentation personnalisée.
De toute façon, comme mentionné ici:
(remarque: la création de nombreux packfiles, ou de la récupération des informations dans d'énormes packfile est coûteux, et d'expliquer pourquoi git ne gère pas bien gros fichiers ou des pensions.
Voir plus à "git avec de gros fichiers")
Ce fil nous rappelle aussi:
LibXDiff est mentionné dans cet 2008 thread.
Cependant, depuis lors, l'algo a évolué, probablement dans une personnalisée, que ce 2011 thread illustre, et comme en-tête de
diff-delta.c
souligne:Plus sur le packfiles le Git Livre:
Git 2.18 ajoute à la description delta dans cette nouvelle section documentation, qui maintenant (T2 2018) membres:
Git delta encodage est de copier/insérer une fonction.
Cela signifie que la dérivée de fichier est codé par une séquence d'opcodes qui peuvent représenter plus de la copie
des instructions(par exemple: copie du fichier de base y octets à partir de l'offset x dans la cible de la mémoire tampon) ou
insérer des instructions(par exemple: l'insertion de la prochaine x octets dans la mémoire tampon).
Comme un exemple très simple(tiré de l'étude "Fichier Système de Soutien pour la Compression Delta'), estiment que nous voulons créer un delta tampon de transformer le texte "proxy cache" dans
"cache proxy".
Les instructions suivantes doivent être:
Qui traduit à git de codage devient:
(octets 1-3 représentent la première instruction)
(octets 4 à 6 représentent la deuxième instruction)
(octets 7 à 8 représentent la dernière instruction)
Avis que, dans la dernière instruction de copie ne permet pas de spécifier un décalage qui signifie que le décalage 0. Les autres bits
dans la copie opcode peut également être défini lorsque le plus gros décalages/longueurs sont nécessaires.
Le résultat delta de la mémoire tampon a, dans cet exemple, dispose de 8 octets, ce qui n'est pas beaucoup de compression
depuis la cible de la mémoire tampon a 12 octets, mais quand ce codage appliqué à la taille du texte les fichiers qu'il peut
faire une énorme différence.
Récemment, j'ai poussé un node.js bibliothèque à github
qui met en œuvre les deux diff/patch fonctions à l'aide de git delta encodage. L'
code devrait être plus lisible
et commenté que la source de git, qui est largement optimisé.
J'ai aussi écrit quelques
tests qui expliquent
la sortie opcodes utilisé dans chaque exemple, avec un format similaire à ci-dessus.
Le pack format fait partie d'une API publique: les protocoles de transfert utilisés pour les pousser et les opérations d'extraction de l'utiliser pour envoyer moins de données sur le réseau.
Ils sont mis en œuvre dans au moins deux autres grands Git implémentations en plus de la référence: JGit et libgit2.
Par conséquent, il est très peu probable qu'il y aura des changements incompatibles avec le format, et peut être considéré comme "normalisé" dans ce sens.
Cette incroyable fichier à partir de la documentation décrit les heuristiques utilisées dans le pack de l'algorithme, comme un drôle de commentaire sur un mail par Linus: https://github.com/git/git/blob/v2.9.1/Documentation/technical/pack-heuristics.txt