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 )
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>)
edge(<obj-c1>, <obj-c2>, stroke: thin, "->")[parent]
tree-object((rel:(-1, 0), to: <obj-c1>), tree1h, [tree], name:<tree1>)
edge(<obj-c1>, <tree1>, stroke: thin, "->")
tree-object((rel:(-1, 0), to: <obj-c2>), "e05dcd",[tree], name: <tree2>)

View file

@ -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.}.

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
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.