Posodobi typ datoteke

This commit is contained in:
Martin Vuk 2026-01-22 18:44:01 +01:00
parent bffed51be9
commit 8614e18f3b
3 changed files with 59 additions and 8 deletions

View file

@ -167,6 +167,7 @@ Add bla".replace("16f299", Eh).replace("65c47fee", tree1h)
node((rel: (4cm, -2.5cm), to: <A>), align(center)[Content addressable object store \ #raw(".git/objects")], stroke: none, snap: false ) node((rel: (4cm, -2.5cm), to: <A>), align(center)[Content addressable object store \ #raw(".git/objects")], stroke: none, snap: false )
commit-object((rel: (1.5, 2), to: <A>), E1h, [Add bla], name: <obj-c1>) commit-object((rel: (1.5, 2), to: <A>), E1h, [Add bla], name: <obj-c1>)
commit-object((rel: (1.5, 3), to: <A>), Eh, [Merge commit], name: <obj-c2>) commit-object((rel: (1.5, 3), to: <A>), Eh, [Merge commit], name: <obj-c2>)
edge(<obj-c1>, <obj-c2>, stroke: thin, "->")[parent]
tree-object((rel:(-1, 0), to: <obj-c1>), tree1h, [tree], name:<tree1>) tree-object((rel:(-1, 0), to: <obj-c1>), tree1h, [tree], name:<tree1>)
edge(<obj-c1>, <tree1>, stroke: thin, "->") edge(<obj-c1>, <tree1>, stroke: thin, "->")
tree-object((rel:(-1, 0), to: <obj-c2>), "e05dcd",[tree], name: <tree2>) tree-object((rel:(-1, 0), to: <obj-c2>), "e05dcd",[tree], name: <tree2>)

View file

@ -12,7 +12,7 @@
#align(center)[ #align(center)[
#set text(size:2em) #set text(size:2em)
*Git za matematike* *Git bolj podrobno*
] ]
#v(2em) #v(2em)
@ -26,23 +26,24 @@ Naučili se bomo, *kako Git deluje*. Spoznali bomo, da so v ozadju Gita
= Kaj je Git? = 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, #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 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 Git *razpršeno skladišče datotek*. Omogoča, da datoteke *hkrati ureja več uporabnikov* na različnih računalnikih in
kasneje spremembe *združi*. kasneje spremembe *združi*.
]
Git hrani vsebino direktorija z datotekami in celotno zgodovino različic datotek iz preteklosti. 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 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. različico. Vse te imformacije dajejo podroben pregled nad zgodovino sprememb.
#note[
Sisteme, ki omogočajo hranjenje preteklih različic datotek, imenujemo 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 #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)). _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. 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] Zato je Git #link("https://en.wikipedia.org/wiki/Distributed_version_control")[distribuiran sistem za nadzor različic]
(angl. Distributed Version Control System (DVCS)). (angl. Distributed Version Control System (DVCS)).
]
V nadaljevanju bomo obravnavali nasledjne teme: 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] - _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 = Podatkovno skladišče
== Git repozitorij == Git repozitorij
Git repozitorij je direktorij v katerem je poddirektorij `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke, Ko ustvarimo nov Git repozitorij, Git ustvari podmapo `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke,
ki jih Git potrebuje. 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 == Vnos: posnetek stanja
Osnovna enota v Gitu je *vnos* (angl. *commit*). Vnos je posnetek stanja zabeleženih datotek v trenutku, 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. Sledi še skica, ki povzame vse komponente Git repozitorija.
#include "git-figure.typ" #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.}.

View file

@ -152,7 +152,7 @@ vsebina objekta določena z njegovo zgostitvijo. To pomeni, da lahko enostavno p
] ]
== trk zgostitev in rojstnodnevni paradoks <sec_trk> == Trk zgostitev in rojstnodnevni paradoks <sec_trk>
Git hrani datoteke pod imeni, ki so enaka zgostitvi vsebine. Če imata dve datoteki z različno vsebino 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. 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.