diff --git a/git-figure.typ b/git-figure.typ index 46f838b..ffcd300 100644 --- a/git-figure.typ +++ b/git-figure.typ @@ -167,6 +167,7 @@ Add bla".replace("16f299", Eh).replace("65c47fee", tree1h) node((rel: (4cm, -2.5cm), to: ), align(center)[Content addressable object store \ #raw(".git/objects")], stroke: none, snap: false ) commit-object((rel: (1.5, 2), to: ), E1h, [Add bla], name: ) commit-object((rel: (1.5, 3), to: ), Eh, [Merge commit], name: ) + edge(, , stroke: thin, "->")[parent] tree-object((rel:(-1, 0), to: ), tree1h, [tree], name:) edge(, , stroke: thin, "->") tree-object((rel:(-1, 0), to: ), "e05dcd",[tree], name: ) diff --git a/git-intro.typ b/git-intro.typ index 7266c0f..2816c75 100644 --- a/git-intro.typ +++ b/git-intro.typ @@ -12,7 +12,7 @@ #align(center)[ #set text(size:2em) -*Git za matematike* +*Git bolj podrobno* ] #v(2em) @@ -26,23 +26,24 @@ Naučili se bomo, *kako Git deluje*. Spoznali bomo, da so v ozadju Gita = Kaj je Git? +#note[ #link("https://git-scm.com/")[Git] je kot *časovni stroj* za datoteke. Uporabniku omogoča, da vidi *pretekle različice* datotek, sprememinja datoteke, *brez skrbi, da bi kaj pokvaril* in datoteke *deli z drugimi*. Poleg časovnega stroja je Git *razpršeno skladišče datotek*. Omogoča, da datoteke *hkrati ureja več uporabnikov* na različnih računalnikih in kasneje spremembe *združi*. +] Git hrani vsebino direktorija z datotekami in celotno zgodovino različic datotek iz preteklosti. Za vsako različico hrani Git zapis o avtorju, datumu in opis sprememb, ki so nastale v primerjavi s predhodno različico. Vse te imformacije dajejo podroben pregled nad zgodovino sprememb. -#note[ + + Sisteme, ki omogočajo hranjenje preteklih različic datotek, imenujemo #link("https://en.wikipedia.org/wiki/Version_control")[sistemi za nadzor različic] (angl. version control system (VCS)) ali _sistemi za upravljanje z izvorno kodo_ (angl. Source Code Management (SCM)). - Poleg nadzora različic Git omogoča hkratno spreminjanje datotek več uporabnikov na različnih računalnikih. Zato je Git #link("https://en.wikipedia.org/wiki/Distributed_version_control")[distribuiran sistem za nadzor različic] (angl. Distributed Version Control System (DVCS)). -] V nadaljevanju bomo obravnavali nasledjne teme: - _Podatkovno skladišče:_ Kako Git uporablja #link("https://sl.wikipedia.org/wiki/Zgo%C5%A1%C4%8Devalna_funkcija")[zgoščevalno funkcijo] @@ -54,11 +55,42 @@ V nadaljevanju bomo obravnavali nasledjne teme: = Podatkovno skladišče - == Git repozitorij -Git repozitorij je direktorij v katerem je poddirektorij `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke, -ki jih Git potrebuje. +Ko ustvarimo nov Git repozitorij, Git ustvari podmapo `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke, +ki jih Git potrebuje. V mapi `.git` se hranijo naslednje stvari: +- zgodovinske različice datotek, ki smo jih dodali v repozitorij, +- drevesna struktura korenske mape in podmap, +- posnetki stanja v razlićnih trenutkih s podatki o avtorju, datumu in opisom sprememb in +- kazalci na posamezne posnetke stanja. + +Git repozitorij je vsaka mapa, ki vsebuje podmapo `.git` z zgoraj +navedenimi podatki. Kako Git hrani podatke bomo spoznali v +nadaljevanju, podrobnosti pa si lahko preberete v knjigi +#link("https://git-scm.com/book/en/v2/Git-Internals-Git-Objects")[Pro Git]. + +== Zgoščevalna funkcija in vsebinsko naslovljiva shramba + +Git ne shranjuje datotek z običajnimi imeni, ampak za ime uporabi 160 +bitno število (40 mestno število v 16-tiškem zapisu), ki ga izračuna iz +vsebine datoteke. Git za izračun imena uporabi *zgoščevalno + funkcijo* (angl. *hash function*) SHA1, ki vsakemu besedilu priredi + $160$-bitno vrednost. Vrednosti zgoščevalne funkcije pravimo *zgostitev* + (angl. *hash*) vsebine. Git hrani datoteke pod imeni, ki so enaka zgostitvi +vsebine#footnote[Načeloma imata lahko dve različni vsebini isto zgostitev. +Če se to zgodi, rečemo, da pride do *trka + zgostitve* (angl. *hash colision*). Vendar je verjetnost trka tako majhna, da lahko + predpostavimo, da se to v praksi ne bo zgodilo.]. + +#note[ +Git hrani različne verzije datotek v +#link("https://en.wikipedia.org/wiki/Content-addressable_storage")[vsebinsko + naslovljivi shrambi objektov], pod imeni, ki so enaka zgostitvi vsebine in ne imenu datoteke. +Ta način shranjevanja omogoča, da lahko: +- preverimo, če ima shranjenjena vsebina isto zgostitev, kot je njeno ime, +- shranimo več različic iste datoteke, saj ima vsaka različica drugačno zgostitev, +- preverimo, če je prišlo do kvaritve podatkov, ki so shranjeni v Git repozitoriju. +] == Vnos: posnetek stanja Osnovna enota v Gitu je *vnos* (angl. *commit*). Vnos je posnetek stanja zabeleženih datotek v trenutku, @@ -248,3 +280,21 @@ Pri pripravi dokumenta sem uporabil Gemini 3. Vse odgovore sem preveril in uredi Sledi še skica, ki povzame vse komponente Git repozitorija. #include "git-figure.typ" + += Dodatek + +== Trki zgostitev in rojstnodnevni problem + +Vendar je zgoščevalna funkcija +izbrana tako, da sprememba enega samega bita v besedilu +spremeni vrednost in je verjetnost trka izjemno majhna. Zato Git lahko predpostavi, da je vsebina +datoteke natanko določena z njeno zgostitvijo. \(H(b)\). +Git uporablja \(160\) bitno zgoščevalno funkcijo \emph{SHA1}, ki se je +uporabljala v kriptografiji\footnote{Leta 2017 so raziskovalci iz CWI + Amsterdam in Google Research našli prvi praktični primer dveh + različnih pdf datotek, ki imata isto SHA1 + zgostitev\cite{stevens_first_2017}. Opisan napad so poimenovali + \emph{SHAttered}. Git je zato z verzijo \texttt{v2.13.0} začel + uporabljati verzijo SHA1, ki je odporna proti napadu \emph{SHAttered}. + Kljub temu razvijalci Gita načrtujejo, da bodo SHA1 postopoma + nadomestili s $256$ bitno zgoščevalno funkcijo SHA-256.}. diff --git a/git-obzornik.typ b/git-obzornik.typ index 69d0cb7..993b442 100644 --- a/git-obzornik.typ +++ b/git-obzornik.typ @@ -152,7 +152,7 @@ vsebina objekta določena z njegovo zgostitvijo. To pomeni, da lahko enostavno p ] -== trk zgostitev in rojstnodnevni paradoks +== Trk zgostitev in rojstnodnevni paradoks Git hrani datoteke pod imeni, ki so enaka zgostitvi vsebine. Če imata dve datoteki z različno vsebino isto zgostitev, Git shrani le eno datoteko in pride do izgubil podatkov. Git se zanaša na to, da je verjetnost za to izjemno majhna.