306 votes

Comment git stocke-t-il les fichiers ?

Je viens de commencer à apprendre git et pour ce faire, j'ai commencé à lire le livre de la communauté Git Dans ce livre, ils disent que SVN et CVS stockent la différence entre les fichiers et que git stocke un instantané de tous les fichiers.

Mais je n'ai pas vraiment compris ce qu'ils entendaient par "instantané". Est-ce que git fait vraiment une copie de tous les fichiers dans chaque commit car c'est ce que j'ai compris de leur explication.

PS : Si quelqu'un a une meilleure source pour apprendre git, je l'apprécierais.

31 votes

Voici un post brillant qui explique en détail le fonctionnement de git. Ce que vous cherchez est probablement le § sur la base de données des objets.

0 votes

Excellent article qui contient des liens vers d'autres excellentes ressources. Je me suis amusé avec ces derniers pendant quelques heures.

3 votes

J'ai trouvé cet article très intéressant qui décrit git de l'intérieur : maryrosecook.com/blog/post/git-from-the-inside-out

347voto

VonC Points 414372

Git inclut pour chaque commit une copie complète de tous les fichiers, sauf que, pour le contenu déjà présent dans le repo Git, le snapshot pointera simplement vers ce contenu plutôt que de le dupliquer.
Cela signifie également que plusieurs fichiers ayant le même contenu ne sont stockés qu'une seule fois.

Donc un instantané est fondamentalement un commit, se référant au contenu d'une structure de répertoire.

Voici quelques bonnes références :

Vous dites à Git que vous voulez sauvegarder un instantané de votre projet avec la commande git commit et il enregistre un manifeste de ce à quoi ressemblent tous les fichiers de votre projet à ce moment-là.

Laboratoire 12 illustre comment obtenir des instantanés précédents


El livre progit a la description plus complète d'un instantané :

La différence majeure entre Git et tout autre VCS (Subversion et ses amis inclus) est la façon dont Git pense à ses données.
D'un point de vue conceptuel, la plupart des autres systèmes stockent les informations sous la forme d'une liste de changements dans les fichiers. Ces systèmes (CVS, Subversion, Perforce, Bazaar, etc.) considèrent les informations qu'ils conservent comme un ensemble de fichiers et les modifications apportées à chaque fichier au fil du temps.

delta-based VCS

Git ne pense pas ou ne stocke pas ses données de cette façon. Au lieu de cela, Git pense à ses données plus comme un ensemble d'instantanés d'un mini système de fichiers.
Chaque fois que vous livrez ou enregistrez l'état de votre projet dans Git, celui-ci prend une photo de l'aspect de tous vos fichiers à ce moment-là et stocke une référence à cet instantané.
Pour être efficace, si les fichiers n'ont pas changé, Git ne stocke pas le fichier à nouveau - seulement un lien vers le fichier identique précédent qu'il a déjà stocké.
Git pense à ses données de la manière suivante :

snapshot-based VCS

C'est une distinction importante entre Git et presque tous les autres VCSs. Elle amène Git à reconsidérer presque tous les aspects du contrôle de version que la plupart des autres systèmes ont copié de la génération précédente. Cela fait de Git un mini-système de fichiers sur lequel sont construits des outils incroyablement puissants, plutôt qu'un simple VCS.

Voir aussi :


Jan Hudec ajoute ceci commentaire important :

Si cela est vrai et important au niveau conceptuel, ce n'est PAS vrai au niveau du stockage.
Git utilise les deltas pour le stockage .
Non seulement cela, mais il est plus efficace dans ce domaine que tout autre système. Parce qu'il ne conserve pas d'historique par fichier, quand il veut faire une compression delta il prend chaque goutte, sélectionne quelques gouttes qui sont susceptibles d'être similaires (en utilisant une heuristique qui inclut la plus proche approximation de la version précédente et quelques autres), essaie de générer les deltas et choisit le plus petit. De cette façon, il peut (souvent, cela dépend de l'heuristique) profiter d'autres fichiers similaires ou d'anciennes versions qui sont plus similaires que la précédente. Le paramètre "pack window" permet d'échanger les performances contre la qualité de la compression des deltas. La valeur par défaut (10) donne généralement des résultats décents, mais lorsque l'espace est limité ou pour accélérer les transferts réseau, git gc --aggressive utilise la valeur 250, ce qui rend son exécution très lente, mais fournit une compression supplémentaire pour les données de l'historique.

4 votes

@JanHudec bon point. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.

1 votes

Quelqu'un connaît-il le terme informatique pour désigner le modèle de stockage de type Git, c'est-à-dire le magasin de valeurs basé sur le hachage ? (ou quelque chose de similaire)

0 votes

@JoannesVermorel dans son tout premier commit pour Git lui-même, Linus Torvalds l'a décrit simplement comme une "collection d'objets adressables par leur contenu" : github.com/git/git/commit/

60voto

svick Points 81772

Git stocke logiquement chaque fichier sous son SHA1. Cela signifie que si vous avez deux fichiers avec exactement le même contenu dans un dépôt (ou si vous renommez un fichier), une seule copie est stockée.

Mais cela signifie également que lorsque vous modifiez une petite partie d'un fichier et que vous livrez, une autre copie du fichier est stockée. La façon dont git résout ce problème est l'utilisation de fichiers pack. De temps en temps, tous les fichiers "libres" (en fait, pas seulement les fichiers, mais aussi les objets contenant des informations sur les commits et les répertoires) d'un repo sont rassemblés et compressés dans un fichier pack. Le fichier pack est compressé à l'aide de zlib. Les fichiers similaires sont également compressés en delta.

Le même format est également utilisé lors du "pulling" ou du "pushing" (du moins avec certains protocoles), de sorte que ces fichiers n'ont pas besoin d'être recompressés à nouveau.

Il en résulte qu'un dépôt git, contenant l'ensemble de la copie de travail non compressée, les fichiers récents non compressés et les fichiers plus anciens compressés, est généralement relativement petit, deux fois plus petit que la taille de la copie de travail. Et cela signifie qu'il est plus petit que le dépôt SVN avec les mêmes fichiers, même si SVN ne stocke pas l'historique localement.

1 votes

Ah donc mercurial est plus efficace dans l'espace

5voto

greg0ire Points 11346

Voici un post brillant qui explique en détail le fonctionnement de git. Ce que vous cherchez est probablement le § sur la base de données des objets.

0voto

Ted Hopp Points 122617

Oui, git fait une copie des fichiers. La philosophie est que dans la plupart des situations, l'espace disque est essentiellement gratuit en grande quantité.

C'est pourquoi les grandes ressources (vidéos, enregistrements sonores, etc.) ne sont souvent pas suivies lorsqu'on utilise git. Voir, par exemple, cette discussion .

P.S. Il y a une bonne introduction à git par Lars Vogel. aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X