Mini Git
Presentation
Objectif principal : Un systeme de controle de version simplifie. Init, add, commit, log, diff, checkout. Pour comprendre comment Git stocke les fichiers et gere l'historique.
Technologies utilisees : C avec SHA-1 pour le hash des contenus (comme Git). Stockage content-addressable dans un dossier .minigit. Structures pour les commits, trees et blobs.
Fonctionnalites cles : init cree le repo, add stage les fichiers, commit cree un snapshot, log affiche l'historique, diff compare deux versions, checkout revient a un commit passe.
Livrables attendus : Un executable avec sous-commandes style Git. Compatible avec des fichiers texte. Historique navigable.
Calendrier previsionnel : Trois semaines. Comprendre le modele objet de Git et le reimplementer ca prend du temps.
Parties prenantes & criteres de succes : Projet perso pour demystifier Git. Apres ca j'ai vraiment compris ce que fait Git en interne.
Le Defi
Le modele objet : blobs (contenu), trees (dossiers), commits (snapshots). Tout est lie par hash SHA-1. Et le staging area (index) qui est un etat intermediaire entre le working directory et le commit. C'est pas trivial.
La Solution
J'ai fait simple : le blob c'est juste le contenu du fichier compresse. Le tree c'est une liste de (mode, nom, hash). Le commit pointe vers un tree et un parent. L'index c'est un fichier qui liste les fichiers stages avec leur hash. Ca suffit pour les bases.
Architecture Technique
Dossier .minigit/objects pour les blobs/trees/commits, .minigit/refs pour les branches, .minigit/HEAD pour la branche courante, .minigit/index pour le staging. Module object.c pour creer/lire les objets. Module index.c pour gerer le staging. Module commit.c pour les commits.
Points Cles
- Stockage content-addressable
- Modele blob/tree/commit
- Staging area fonctionnel
Apercu
Resultats & Apprentissages
Je peux faire des commits, voir l'historique, revenir en arriere. Git n'est plus une boite noire pour moi. J'ai compris pourquoi c'est si rapide (tout est hash) et pourquoi les merges sont possibles (base commune via les commits parents).
Evolutions Futures
Ajouter les branches et le merge (au moins fast-forward). Un vrai diff ligne par ligne. Peut-etre le push/pull vers un remote. Compression des objets comme le vrai Git.