 Qu'est-ce que le GIT ? Le GIT, comme Linus dit, est comme un système de file. Comme un système de file, vous pouvez trouver un file. Mais le nom de ce file est Blob. Et il y a quelques directrices et le nom de GIT, c'est 3. Donc pour tout ceci, c'est votre système de file. Et nous expliquons chaque objectif du GIT. Donc premièrement, nous avons le Blob. Donc le Blob est comme votre système de file dans votre système de file. Et chaque Blob contène entièrement votre file. Et à la fin, nous avons un GIT-Adder, comme le genre du objectif de GIT. Donc c'est le Blob. Et après, nous avons le length du objectif de GIT. Et donc nous pouvons voir le code OCaml. C'est de l'extrême librairie, pour décrire ou décrire quelque chose. Et nous avons le texte EBNF. Donc de ceci, nous expliquons le Blob. Donc nous prenons l'Adder et nous prenons entièrement votre file. Nous mettons tout dans l'implémentation hash. Et l'implémentation hash vous donne un identifiant unique. Donc c'est un hash comme le SHA-1. Parce que si vous utilisez le GIT, vous savez, vous utilisez le SHA-1. Et parce que nous avons l'Adder dans la première partie, c'est pourquoi quand vous obtenez le SHA-1 directement de votre file, vous ne pouvez pas obtenir le même value hash du GIT. Donc juste ces choses. Donc après d'identifier votre Blob, c'est comme si vous utilisez le SHA-1. Et currently, en OCaml GIT, vous pouvez utiliser le SHA-1, mais si vous ne savez pas, nous breakons le SHA-1. Donc maintenant, le plan en GIT, c'est de bouger à la fonction de la function black. Mais en OCaml GIT, nous pensons déjà sur cela, et vous pouvez changer à votre implementation hash. Et currently, nous utilisons le SHA-2567. Donc après, nous avons les trois. Comme je l'ai dit, les trois sont comme directrices, donc c'est juste une liste d'entrée. L'entrée qui décrive chaque file sur votre directrice et chaque subdirectrice sur votre directrice. Donc pour chaque entrée, nous avons la permission, c'est comme le genre d'objectif. Donc c'est une directrice, un file GIT, ou quelque chose comme ça. Et la permission, comme si nous pouvons écrire ou exécuter le file. Et après, nous avons le nom de l'entrée, donc comme le nom de l'entrée, ou le nom de l'entrée. Et nous avons l'identif unique, donc le hash pour le objectif GIT. Donc c'est un petit exemple. Donc pour l'exemple, nous avons un directrice et un file. Et là, d'ici, nous pouvons ajouter ce七. Avec cette permission nous pouvons reconnaître si c'est le directeur de l'entrée de l'entrée et après, de la nom et le nom d' rumor. L'identif du hash. Donc pour tout ce type, quand vous voulez écrire ou exécuter un objectif GIT, donc par exemple, nous avons un bloc. Avec un certain hash, et nous avons changé le GIT. Donc on génère un nouveau hash de ce bloc, un nouveau identifiant unique. On doit changer les 3 qui contiennent le bloc, parce qu'il contient l'ancien identifiant hash, donc on doit changer ça pour le nouveau identifiant hash du fil. Mais parce qu'on change le value hash, on change le hash de la 3, encore. Et encore, la direction qui contient la direction qui contient le bloc, on change 2, parce qu'on change l'ancien identifiant hash de la 3. Donc on doit changer l'ancien identifiant hash de la 3 qui contiennent le bloc. Et après, on change l'ancien identifiant hash de la route 3, qui contient la direction qui contient le bloc. Donc pour tout ça, on change l'intégrité de votre fil système. Donc, tous les changements dans votre fil système, dans votre repository, ont besoin d'updater l'ancien identifiant hash pour tous les changements. Ce n'est pas comme un cascading. Donc, quand vous appuyez « add », ce n'est pas comme « just put a new blob in your git repository », c'est comme « we put a new blob and we put old tree, which depend on your blob ». Donc, on a le snapshot de votre fil système avec le mercred tree. Donc, on a des haches, et on compose cette hache et on arrive au final hache de la route 3. Et après, on a le commit. Donc le commit est comme « we save one time the snapshot of your file system ». Donc, un commit est vraiment simple. On a la route 3, c'est comme la route de votre repository. Après, on a les parents. C'est comme « where come from this commit ». Donc, c'est comme « some over commit ». Donc, la main chose est comme « come from one commit ». Mais quand vous merge un commit, c'est comme « come from two commit ». Et après, on a le « author » et le « cometer » et le « message » dans le commit. Et encore, c'est comme un blockchain pour Bitcoin et Ethereum et quelque chose comme ça. Parce que pour chaque commit, on a le lien avec le premier commit, comme le blockchain. Parce que dans le Bitcoin, pour chaque blockchain, on a le « hash identifier » mais ce n'est pas le même « hash » mais c'est le même « thing » pour le premier « block ». Et comme vous voyez, le premier commit, le dernier commit point à deux premiers commits. C'est comme un « merging » de deux commits. Et j'ai pris le élément parce que le commit remet tous vos histoires et vérifie encore l'intégrité de votre histoire. Donc, pour tout ce « link » parce que nous avons fait le « link » entre le « tree » le « blob » et le « commit » on peut considérer un « git » comme un « graph » c'est comme un « big graph » et je vous montre. C'est un « little graph » ce n'est pas si grand et c'est une spécifique « git repository ». Si vous voulez cloner ce « git repository » vous pourriez avoir un problème avec « git » et vous pourriez avoir un « sec fault ». Donc c'est un « bug » maintenant. Peut-être que vous le voyez dans « reddit » et « hacker news ». Mais le truc est comme dans le « top » nous avons un « free commit » et après nous avons un « tree » « root » et parce que la « hash identity here » est unique, c'est comme si vous si vous voulez bouger par exemple un « file » d'une « directory » d'une autre « directory » ce n'est pas comme « we create a new blob » parce que c'est exactement le même file. Donc nous produisons la même « hash » de la même « blob ». Donc quand vous bougez un « blob » c'est juste comme nous change le « tree » qui contient le « blob ». Donc nous déletons le « blob » de l'un et l'autre « tree » et nous mettons le « new entry » dans le « tree » avec le même « blob ». Et c'est pourquoi vous pouvez voir pour le « free tree » « root » ce « tree root » pointe à la même « tree » c'est comme si nous avons 9 « directories » mais pointe à la même « value » de « directories » et encore ce « tree » pointe à 9 « over directories » et pointe à la même « value » de « directories » et encore et encore et finalement nous avons 9 « files » donc parce que nous avons 9 « links » qui contiennent exactement la même « value » comme c'est juste « hello world » et parce que c'est un « exponential directories » donc c'est comme 9 « exponentials » 9 « directories » et c'est comme si nous réutiliserons le « git object » et après nous pouvons manipuler le « git graph » le « git repository » comme un « graph » donc évidemment le « git can clone » ce « git repository » et non le « git » donc c'est une bonne news et c'est comme un « bomb » pour le « git » donc parce que nous identifions chaque « snapshot » de votre « file system » de votre « git repository » par le « shawan » ce n'est pas très convenu pour les gens humains pour rappeler quel « shawan » que j'utilise donc c'est un petit peu complexe et c'est pourquoi nous utilisons les références et les références c'est juste une valeur humaine rédable qui contient le « hash » au « commit » ou une autre référence qui contient le « hash » de la « commit » etc. donc mais le problème de référence c'est la seule valeur limitée de votre « git repository » donc nous avons besoin de protéger l'input-output computation donc dans « okamel git » vous avez juste besoin d'avoir une implementation de « lock » et après nous utilisons pour protéger les références donc c'est un exemple quand nous mutons la valeur de référence votre « git » ajoute un file après vous à cette étape vous avez un « hash » sur le « head » référence et quand vous « commit » le « head » référence sera updaté avec le « new hash » de votre « last commit » donc c'est le point donc c'est la grande chose sur « git » mais maintenant nous allons expliquer ce que nous avons sous la « hood » donc comment pour protéger le « git object » avec « git » donc la première c'est comme le « loose file » le « loose file » c'est comme « ok, nous avons un « git object » donc c'est un « tree » mais il ne s'intéresse pas avec « okamel git » nous serialise le « tree » donc nous avons un « okamel value » et nous créons un « raw data » de la « tree » et après nous avons besoin de « compress » pour déflater la « raw data » donc nous avons une « implementation de « zlib » en « pure okamel » et avec cette implementation nous créons donc une « compressed value » de la « tree » et après nous avons juste besoin de « move on » ce « file » pour cette « directory » donc comme vous pouvez voir la première « byte » de la « hash » semble être la « directory » et après nous avons le « rest » de la « hash » et quand vous voulez obtenir un « git object » c'est comme juste prendre la première « byte » aller au « directory » faire une « binary search » pour chaque file dans la « directory » et trouver votre « git object » donc c'est une « really fast » et c'est comme un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » un « radix 3 » c'est comme on a la « key » comme une « string » et nous voulons balancer la « left » et la « right » partie de la « specific byte » de la « string » et quand vous avez beaucoup de « git object » comme beaucoup de « hash » « key » c'est comme ok le « radix 3 » balance le « tree » sur la première « byte » donc c'est pourquoi nous utilisons comme ça et après nous avons le « git object » mais nous avons d'autres moyens pour stocker le « git object » c'est le « pack file » donc c'est ce que vous avez à la première fois quand vous clonez un « git repository » vous n'avez pas d'un « lose object » le « lose object » apparaît seulement quand vous ajoutez quelque chose quand vous travaillez avec votre « git repository » mais la première vous avez le « pack file » et le « pack file » c'est juste une liste d'un « git object » et après vous avez le « git object » et vous pouvez décérériser le « git object » mais une autre chose sur le « pack file » c'est la compression parce que par exemple si vous mets un « movi » ou un « image » dans votre « git repository » c'est comme dans votre « pack file » vous avez l'image interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle interrègle intense t le « pack file » et la forgettingkon Indeed Any use Bye un object object référencé par un hash ou un set relative. Donc, si c'est un set relative, c'est comme, OK, tu viens de retourner à 10 bytes avant, et tu peux trouver l'object object. Et de la source et de la liste de unk, nous pouvons obtenir quelque part de la source. Donc, en gris, nous avons un bloc insert, c'est comme un data raw. Et en rouge, nous avons un bloc copy. C'est comme un référence à quelque part de la source file. Et nous faisons la détaillification. C'est comme, nous copierons la partie grise, et nous prenons le bloc et copierons. Et après, nous générons l'object object. Donc, c'est comme un big div, mais un optimisé div, pas comme un passions div ou quelque chose comme ça. C'est comme un div sur le byte. C'est pourquoi le pack file est très petit. Et une autre chose sur le pack file est quand nous essayons de détaillifier un object object, ce n'est pas comme, nous prenons le premier bloc de githes comme vous le faites, et essayons de détaillifier avec la nouvelle version. C'est comme, nous prenons le dernier bloc, et nous détaillons avec le plus grand. Parce que nous pensons que le plus grand file est plus optimisé pour obtenir l'intérêt du plus grand file et faire la détaillification avec le plus grand file. Parce que vous pouvez trouver toute la partie du plus grand file dans le plus grand file. Donc, quand vous détaillez un file comme le plus grand file, c'est juste une liste de copies. Donc, les plus grands choses. Et après, nous pouvons parler du protocole. Donc, le protocole est un peu... Ce n'est pas si compliqué. Quand vous détaillez, c'est comme, vous demandez à l'interieur ce qu'il a. Donc, il vous montre des références et le hash bindé sur les références. Et après, vous avez besoin d'expliquer ce que vous voulez. Donc, vous avez 3 actions comme un update, un create ou un délai. Donc, un update est comme, OK, nous avons les mêmes références et je veux updater ces références pour ce nouveau commit. Le create est de créer un nouveau référence et le délai est de délai un de ces références. Donc, après, vous avez besoin de compter 2 sets de commits. La première est le set de tous vos commits et la deuxième est le set de tous les commits réchaînés par le dernier commit du service. Donc, c'est comme, le service vous montre le dernier commit que vous avez et après, par les parents, vous trouvez, vous créez un set. Et de ces deux sets, vous faites un délai. Donc, ce sont tous vos commits, les commits que vous pouvez trouver dans le service et en red, c'est tous les commits dont le service n'a pas. Et de cet délai, vous créez un nouveau set. Donc, c'est comme, juste un set délai et vous faites un pack stream, comme juste avant, donc avec la délai, etc, etc, et le set au service. Et de l'au-delà, donc le service au client, donc, à la première, c'est le même. Le service dit à vous ce qu'il a. Et après, vous expliquez juste ce que vous voulez. Donc, vous voulez une certaine hache. Vous avez besoin de comparer la hache dans votre référence de tête avec la hache de référence de tête dans le service. Et si c'est différent, c'est comme, ok, peut-être que c'est plus de updates que moi. Et nous commençons une négociation en gène entre le service et le client. La négociation en gène, c'est comme, ok, nous avons dit ce que j'ai à la service et le service répond en continu. Et le service ressent ce que j'ai dans le côté. Et après, à la fin, quand vous trouvez le meilleur place commun entre vous et ce qu'il a, il vous envoie déjà et vous envoie le pack string, donc, le pack file, encore. Donc, c'est comme, nous essayons de trouver ce que nous avons ensemble. Et après, quand nous avons cette ensemble, nous faisons le défi, encore, comme le push command, et vous envoiez. Le truc est comme, pour le push request, nous ne pensons pas que parfois, vous pouvez, parfois, vous envoiez un comité qui, le service, a déjà, mais ça ne va pas, parce que c'est ok. Mais, sur l'arrivée, donc, sur le service, sur le service et le client, c'est comme, ok, nous voulons optimiser le pack file et envoie exactement ce que vous voulez. Et ne pas avoir deux fois le même objectif dans votre côté et dans le pack file. Donc, pour tout ceci, nous impliquons tout ceci dans notre camel Git. Donc, nous impliquons le clone, le fetch, le pool, le clone et le pool, c'est juste un cas spécifique de la commande fetch, le push command. Nous impliquons toutes les choses sur le Git. Donc, nous pouvons avoir un petit, un nouveau commande de Git, si vous voulez. Donc, certains projets utilisent déjà le camel Git. Nous avons TISOS, c'est des crypto-monnaies. Ce n'est pas exactement des crypto-monnaies, mais c'est des smart contracts. Et, utilisez le camel Git pour avoir le mercredi, parce que le Git, c'est le mercredi, et simulatez la choice entre chaque operation, chaque service, et simulatez, par le Git. Et après, nous avons le project unicernel et, spécifiquement, le MirageOS project, donc c'est unicernel inocamel. Et le project, c'est comme un store KV sur le top de Git. Donc, les choses pour cela sont d'avoir un unicernel qui store votre repository Git. Et après, vous pouvez avoir une idée, comme un serveur réplication, comme un système backup. Donc, vous avez juste un serveur qui contient seulement le camel Git et mettez ce que vous avez dans ce serveur, comme un backup. Pour moi, c'est comme, j'aimerais faire un serveur storage pour l'email, mais nous pouvons faire un service de biturant annoncement et faire une réplication entre elles, et quelque chose avec MirageOS. C'est unicernel. Et si vous voulez une nouvelle ligne de commande, mais c'est difficile de le faire. Donc, si vous avez une question,