Diagrame daj v svoje datoteke

This commit is contained in:
Martin Vuk 2026-01-14 11:16:07 +01:00
parent 0e6a68fb0a
commit b6c83ca3e5
8 changed files with 140 additions and 111 deletions

View file

@ -17,3 +17,5 @@
#let file-object(coord, hash, name, ..args) = commit-object(coord, hash, name, #let file-object(coord, hash, name, ..args) = commit-object(coord, hash, name,
width: 2cm, fill: gray.lighten(50%), ..args) width: 2cm, fill: gray.lighten(50%), ..args)
#let git-object(hash, content) = table(columns: 1, [Zgoščena vrednost: #raw(hash)], raw(block:true, content)) #let git-object(hash, content) = table(columns: 1, [Zgoščena vrednost: #raw(hash)], raw(block:true, content))
#let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla]
#let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla]

21
diagrams/branch-move.typ Normal file
View file

@ -0,0 +1,21 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object
#diagram(node-stroke: 0.5pt,
{
node((1, -1), [main], shape: chevron, name: <main-old>, stroke:(dash: "dotted"))
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>, stroke: blue)
node((2, -1), [main], shape: chevron, name: <main>)
node((1, 1), [v-1.0], shape: chevron, name: <tag>)
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->", stroke: blue)
edge(<main-old>, <commit3>, "->", stroke: (dash: "dotted"))
edge(<tag>, <commit3>, "->")
edge(<main>, <commit4>, "->")
}
)

View file

@ -0,0 +1,19 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object
#diagram(node-stroke: 0.5pt,
{
node((2, -1), [main], shape: chevron, name: <main>)
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>)
node((0, 1), [v-1.0], shape: chevron.with(dir: left), name: <tag>)
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->")
edge(<main>, <commit4>, "->")
edge(<tag>, <commit2>, "->")
}
)

View file

@ -0,0 +1,24 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object
#diagram(node-stroke: 1pt, node-shape: pill,
{
let (Ah, Bh, Ch, Dh, Eh, Fh, Gh) = ("d93434", "2ca420", "dd0d98", "28782c", "710310", "3f2922","d2a671")
let (A, B, C, D, E, F, G) = ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (2, 1), (3, 1))
node(A, raw(Ah))
node(B, raw(Bh))
node(C, raw(Ch))
node(D, raw(Dh))
node(E, raw(Eh))
node(F, raw(Fh))
node(G, raw(Gh))
edge(B, A, "->")
edge(C, B, "->")
edge(D, C, "->")
edge(E, D, "->")
edge(G, F, "->")
edge(F, B, "->")
edge(D, F, "->")
}
)

16
diagrams/file-graph.typ Normal file
View file

@ -0,0 +1,16 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object, bla, blabla
#diagram(
{
bla((-1, 1), name:<bla>)
blabla((-1, 0), name: <blabla>)
tree-object((1, 1), "ae247f", name: <mapa>)[drevo]
tree-object((3, 0), "473e0b", name: <root>)[drevo]
edge(<root>, <bla>, "->", label-angle: auto)[`bla.txt`]
edge(<root>, <mapa>, "->", label-angle: auto, label-sep: -1.2em)[`mapa`]
edge(<mapa>, <bla>, "->", label-angle: auto, label-sep: -1.2em)[`bla.txt`]
edge(<root>, <blabla>, "->")[`blabla.txt`]
}
)

22
diagrams/head-index.typ Normal file
View file

@ -0,0 +1,22 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object
#diagram(node-stroke: 0.5pt,
{
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>, stroke: (dash: "dotted"))
node((1, -1), [main], shape: chevron, name: <main>)
node((1, 1), [HEAD], shape: chevron, name: <head>)
node((2, 1), [index], shape: rect, name: <index>, stroke: (dash: "dotted"))
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->", stroke: (dash: "dotted"))
edge(<index>, <commit4>, "->", stroke: (dash: "dotted"))
edge(<head>, <commit3>, "->")
edge(<main>, <commit3>, "->")
}
)

View file

@ -0,0 +1,26 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object, bla, blabla
#diagram(
{
node((0, -1))[vsebina (blob)]
node((2, -1))[drevesa (tree)]
node((4, -1))[vnosi (commit)]
bla((0, -0.5), name:<bla>)
blabla((0, 0.5), name:<blabla>)
file-object((0, 1.5),"33476f", name:<bla1>)[bla!]
tree-object((2, 0), "5e12fg", name:<koren0>)[koren]
tree-object((2, 1), "32e4f1", name: <koren1>)[koren]
commit-object((4, 0), "7e43a1", name: <commit0>)[Prvi vnos]
commit-object((4, 1), "4ef531", name: <commit1>)[Popravi bla.txt]
edge(<commit0>, <koren0>, "->")
edge(<commit1>, <koren1>, "->")
edge(<commit1>, <commit0>, "->")[starš]
edge(<koren0>, <bla>, "->")[bla.txt]
edge(<koren1>, <bla1>, "->", label-angle: auto)[bla.txt]
edge(<koren0>, <blabla>, "->", label-angle: auto)[blabla.txt]
edge(<koren1>, <blabla>, "->", label-angle: auto)[blabla.txt]
edge(<commit0>, <koren0>, "->")
}
)

View file

@ -18,7 +18,7 @@
#align(center)[ #align(center)[
#text(size:2em)[*Git za matematike*] #text(size:2em)[*Matematika v Gitu*]
#v(2em) #v(2em)
Martin Vuk Martin Vuk
] ]
@ -136,22 +136,10 @@ Git bo shranil naslednje objekte v vsebinsko naslovljivo shrambo:
Git z uporabo zgostitve kot kazalca na vsebino, vsebino mape postavi v podatkovno strukturo, ki jo matematično lahko opišemo z _usmerjenim acikličnim grafom_. Ko je vsebina Git z uporabo zgostitve kot kazalca na vsebino, vsebino mape postavi v podatkovno strukturo, ki jo matematično lahko opišemo z _usmerjenim acikličnim grafom_. Ko je vsebina
datotek enaka(npr. `bla.txt` in `mapa/bla.txt`), Git shrani le eno kopijo, ki je dostopna v datoteki `.git/objects/bc/c1382241e267cf790ca6b3afe9fde6dcf1072f`. Zato datotečno drevo v Gitu ni nujno predstavljeno kot drevo, ampak kot usmerjen aciklični graf. datotek enaka(npr. `bla.txt` in `mapa/bla.txt`), Git shrani le eno kopijo, ki je dostopna v datoteki `.git/objects/bc/c1382241e267cf790ca6b3afe9fde6dcf1072f`. Zato datotečno drevo v Gitu ni nujno predstavljeno kot drevo, ampak kot usmerjen aciklični graf.
#let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla] #figure(
#let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla] include "diagrams/file-graph.typ",
caption: [Primer datotečnega grafa povezanega z zgostitvami. Zaradi preglednosti bomo v slikah izpisali le prvih 6 znakov zgostitve.]
#figure(caption: [Primer datotečnega grafa povezanega z zgostitvami. Zaradi preglednosti bomo v slikah izpisali le prvih 6 znakov zgostitve.], )
diagram(
{
bla((-1, 1), name:<bla>)
blabla((-1, 0), name: <blabla>)
tree-object((1, 1), "ae247f", name: <mapa>)[drevo]
tree-object((3, 0), "473e0b", name: <root>)[drevo]
edge(<root>, <bla>, "->", label-angle: auto)[`bla.txt`]
edge(<root>, <mapa>, "->", label-angle: auto, label-sep: -1.2em)[`mapa`]
edge(<mapa>, <bla>, "->", label-angle: auto, label-sep: -1.2em)[`bla.txt`]
edge(<root>, <blabla>, "->")[`blabla.txt`]
}
))
Posledično lahko vsebino celotne mape opišemo z eno samo zgostitvijo. Če spremenimo vsebino, ime ali lokacijo datoteke, bo sprememba vplivala na zgostitev spremenjene vsebine in sprememba bo splavala na površje do zgostitve za korensko mapo. Zgostitev služi tako kot identifikator vsebine, kot tudi kot kontrolna vsota, ki omogoča detekcijo sprememb. Posledično lahko vsebino celotne mape opišemo z eno samo zgostitvijo. Če spremenimo vsebino, ime ali lokacijo datoteke, bo sprememba vplivala na zgostitev spremenjene vsebine in sprememba bo splavala na površje do zgostitve za korensko mapo. Zgostitev služi tako kot identifikator vsebine, kot tudi kot kontrolna vsota, ki omogoča detekcijo sprememb.
@ -228,27 +216,7 @@ Vsak vnos je povezan s točno določenim posnetekom vsebine korenskega datotečn
*Povezave* v grafu povezujejo vnose z njihovimi starši. *Povezave* v grafu povezujejo vnose z njihovimi starši.
#figure( #figure(
diagram(node-stroke: 1pt, node-shape: pill, include "diagrams/commit-history.typ",
{
let (Ah, Bh, Ch, Dh, Eh, Fh, Gh) = ("d93434", "2ca420", "dd0d98", "28782c", "710310", "3f2922","d2a671")
let (A, B, C, D, E, F, G) = ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (2, 1), (3, 1))
node(A, raw(Ah))
node(B, raw(Bh))
node(C, raw(Ch))
node(D, raw(Dh))
node(E, raw(Eh))
node(F, raw(Fh))
node(G, raw(Gh))
edge(B, A, "->")
edge(C, B, "->")
edge(D, C, "->")
edge(E, D, "->")
edge(G, F, "->")
edge(F, B, "->")
edge(D, F, "->")
}
),
caption: [Vnosi v Gitu kot usmerjen graf. Vsak vnos(razen prvega) ima povezavo na vnose iz katerih izhaja.] caption: [Vnosi v Gitu kot usmerjen graf. Vsak vnos(razen prvega) ima povezavo na vnose iz katerih izhaja.]
) )
@ -260,29 +228,7 @@ Objekti so poevazni v _usmerjen aciklični graf_. Podgraf na vnosih določa zgod
#figure( #figure(
caption: [Vsebinsko naslovljiva shramba objektov v Gitu. Naslovi so zgostitve vsebine. Shramba vsebuje dva vnosa. V prvem vnosu smo dodali dve datoteki `bla.txt` in `blabla.txt`, v drugem vnosu pa smo spremenili le vsebino datotoeke `bla.txt`.], caption: [Vsebinsko naslovljiva shramba objektov v Gitu. Naslovi so zgostitve vsebine. Shramba vsebuje dva vnosa. V prvem vnosu smo dodali dve datoteki `bla.txt` in `blabla.txt`, v drugem vnosu pa smo spremenili le vsebino datotoeke `bla.txt`.],
diagram( include "diagrams/object-storage.typ"
{
node((0, -1))[vsebina (blob)]
node((2, -1))[drevesa (tree)]
node((4, -1))[vnosi (commit)]
bla((0, -0.5), name:<bla>)
blabla((0, 0.5), name:<blabla>)
file-object((0, 1.5),"33476f", name:<bla1>)[bla!]
tree-object((2, 0), "5e12fg", name:<koren0>)[koren]
tree-object((2, 1), "32e4f1", name: <koren1>)[koren]
commit-object((4, 0), "7e43a1", name: <commit0>)[Prvi vnos]
commit-object((4, 1), "4ef531", name: <commit1>)[Popravi bla.txt]
edge(<commit0>, <koren0>, "->")
edge(<commit1>, <koren1>, "->")
edge(<commit1>, <commit0>, "->")[starš]
edge(<koren0>, <bla>, "->")[bla.txt]
edge(<koren1>, <bla1>, "->", label-angle: auto)[bla.txt]
edge(<koren0>, <blabla>, "->", label-angle: auto)[blabla.txt]
edge(<koren1>, <blabla>, "->", label-angle: auto)[blabla.txt]
edge(<commit0>, <koren0>, "->")
}
)
) )
= Kazalci: veje in značke = Kazalci: veje in značke
@ -290,21 +236,7 @@ Objekti so poevazni v _usmerjen aciklični graf_. Podgraf na vnosih določa zgod
Poleg objektov kot so _vnosi_, _posnetki map_ in _posnetki datotek_ pozna git še reference. Reference so kazalci z določenim imenom na posamezen vnos. Poleg objektov kot so _vnosi_, _posnetki map_ in _posnetki datotek_ pozna git še reference. Reference so kazalci z določenim imenom na posamezen vnos.
#figure( #figure(
diagram(node-stroke: 0.5pt, include "diagrams/branches-tags.typ",
{
node((2, -1), [main], shape: chevron, name: <main>)
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>)
node((0, 1), [v-1.0], shape: chevron.with(dir: left), name: <tag>)
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->")
edge(<main>, <commit4>, "->")
edge(<tag>, <commit2>, "->")
}
),
caption: [Veja (angl. branch) ali značka(angl. tag) je preprost kazalec na posamezen vnos(angl. commit). ] caption: [Veja (angl. branch) ali značka(angl. tag) je preprost kazalec na posamezen vnos(angl. commit). ]
) )
@ -315,23 +247,7 @@ Referenc git ne hrani v skladišču objektov, temveč posebej v mapi `.git/refs`
*Značka* (angl. *tag*) je referenca, ki je statična in se ne premika več, ko jo enkrat ustvarimo. *Značka* (angl. *tag*) je referenca, ki je statična in se ne premika več, ko jo enkrat ustvarimo.
#figure( #figure(
diagram(node-stroke: 0.5pt, include "diagrams/branch-move.typ",
{
node((1, -1), [main], shape: chevron, name: <main-old>, stroke:(dash: "dotted"))
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>, stroke: blue)
node((2, -1), [main], shape: chevron, name: <main>)
node((1, 1), [v-1.0], shape: chevron, name: <tag>)
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->", stroke: blue)
edge(<main-old>, <commit3>, "->", stroke: (dash: "dotted"))
edge(<tag>, <commit3>, "->")
edge(<main>, <commit4>, "->")
}
),
caption: [Ko ustvarimo nov vnos, se aktivna veja `main` premakne naprej, značka `v-1.0` pa ostane tam, kjer je bila. ] caption: [Ko ustvarimo nov vnos, se aktivna veja `main` premakne naprej, značka `v-1.0` pa ostane tam, kjer je bila. ]
) )
@ -344,24 +260,7 @@ Vse te pomene damo vejam ljudje, ki sodelujemo v nekem Git repozitoriju. Za Git
*HEAD* je posebna referenca, ki kaže na trenutno aktiven vnos. Vnos, na katerega kaže _HEAD_ bo starševski vnos naslednjeg vnosa, ki ga bomo dodali. *HEAD* je posebna referenca, ki kaže na trenutno aktiven vnos. Vnos, na katerega kaže _HEAD_ bo starševski vnos naslednjeg vnosa, ki ga bomo dodali.
#figure( #figure(
diagram(node-stroke: 0.5pt, include "diagrams/head-index.typ",
{
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
node((2, 0), [`4e96a1`], shape: pill, name: <commit4>, stroke: (dash: "dotted"))
node((1, -1), [main], shape: chevron, name: <main>)
node((1, 1), [HEAD], shape: chevron, name: <head>)
node((2, 1), [index], shape: rect, name: <index>, stroke: (dash: "dotted"))
edge(<commit2>, <commit1>, "->")
edge(<commit3>, <commit2>, "->")
edge(<commit4>, <commit3>, "->", stroke: (dash: "dotted"))
edge(<index>, <commit4>, "->", stroke: (dash: "dotted"))
edge(<head>, <commit3>, "->")
edge(<main>, <commit3>, "->")
}
),
caption: [*HEAD* je referenca na trenutno aktiven vnos. _Index_ vsebuje spremembe, ki bodo zabeležene v naslednjem vnosu.] caption: [*HEAD* je referenca na trenutno aktiven vnos. _Index_ vsebuje spremembe, ki bodo zabeležene v naslednjem vnosu.]
) )