summaryrefslogtreecommitdiff
path: root/2.md
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2022-06-03 21:00:26 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2022-06-03 21:00:26 +0200
commit270b0e15c843ace238a2b12b9d6089ec76dbff26 (patch)
treed11e5ef45b3555a6dabc8cd9ecdf1a974060395a /2.md
parent9403b49059cb94463427d9dc5043caa5d4bf1945 (diff)
finish first version
Diffstat (limited to '2.md')
-rw-r--r--2.md370
1 files changed, 370 insertions, 0 deletions
diff --git a/2.md b/2.md
index b9e1e0c..d608772 100644
--- a/2.md
+++ b/2.md
@@ -648,3 +648,373 @@ Automatizatu daiteke: `git bisect run <command>`
- Komandoak `0` bueltatu behar du testa ondo badoa eta beste edozer errorea
badago
+
+
+## Submoduluak
+
+Gure proiektuaren barruan azpiproiektuak kudeatzeko modu bat da.
+
+- `git submodule add <URL>` azpiproiekturako karpeta berri bat gehitzen du eta
+ `.gitmodules` fitxategia hasieratzen du
+- `.gitmodules` fitxategian azpiproiektuen informazioa gordetzen da: URLa,
+ izena eta path-a.
+- `git submodule add ...` eta gero `git diff --cached` egitean ikusten da
+ submoduluen path-a ez dela fitxategi bezala kudeatzen:
+ `"Subproject commit ---"`
+- `git diff --submodule --cached`-ekin hobeto ikusten da
+- `git push` egiterakoan submodule-aren direktorioa erreferentzia moduan
+ pusheatzen da.
+
+## Submoduluak klonatzeko
+
+- `git clone`-ek **ez** ditu proiektuen submoduluak deskargatzen
+- `git submodule init` submoduluen kontrola hasieratzeko
+- `git submodule update` submoduluen fitxategiak berrizteko
+- `git clone --recurse-submodule <URL>` zuzenean submodule guztiak
+ deskargatzeko `clone` egiterakoan. Bestela `git submodule update --init` edo
+ `git submodule update --init --recursive` egin daiteke klonatu eta gero
+
+## Submoduluekin lanean
+
+- `git diff --submodule` ez egiteko `git config --global diff.submodule log`
+ egin daiteke eta zuzenean submoduluaren diffa ikusi daiteke `git diff`
+ egitean
+- `git submodule update --remote <submodule>` submoduluen edukiak berrizteko
+ edo bestela submoduluaren barruan `fetch`+`merge` egin daiteke.
+- `git config -f .gitmodules submodule.<submodule>.branch <adarra>` adarrez
+ aldatzeko, edo fitxategia zuzenean aldatu
+- `git config status.submodulesummary 1` egitean `git status`-ek submoduluen
+ egoera bistaratuko du
+- `git log --submodule` submoduluen aldaketak ikusteko
+
+## Submoduluak dituen proiektua berrizteko
+
+- `git pull` ez ditu submoduluak berritzen, informazioa baino ez du
+ deskargatzen.
+- `git submodule update` aplikatu behar da, `--init`-ekin submodule berriak
+ gehitu badira, hauek gehitzeko eta `--recursive`, submoduluek submoduluak
+ badituzte.
+- `git pull --recurse-submodules`-k efektu berdina dauka. Konfiguratu daiteke
+ automatikoki egiteko.
+- `git submodule sync` egin behar da URLak aldatu badira.
+
+## Submoduluetan lanean
+
+Normalean ez da submoduluetan idazten, baina egin daiteke.
+
+- `git submodule update`-k azpirepositorioa *detached head* egoeran uzten du.
+ Bertak commitak gehitzean galduko lirateke (ez dago adarrik commitetara
+ ailegatzeko). Hau konpontzeko:
+
+ 1. Adarrak konfiguratu behar dira: `cd <submodule> && git checkout <branch>`
+ 2. `git submodule update --remote --merge/--rebase` egin behar da *detached
+ head* egoeran ez gelditzeko. Submoduluan aldaketak badaude, konfliktoa
+ egon daiteke.
+
+## Submoduluen lana publikatzen
+
+- `git push` egin daiteke submodulu bakoitzean, Git repositorio normalak
+ baitira
+- `git push --recurse-submodules=check/on-demand` bi estrategia dago. `check`
+ aldaketak pusheatu behar diren begiratzen du, eta `on-demand`-ek pusha egiten
+ du submodulu bakoitzean aldaketak badaude
+ - `git config push.recurseSubmodules check/on-demand` estrategia defektuz
+ konfiguratzeko
+
+## Submoduluen trukoak
+
+- `git submodule foreach <command>` egin daiteke submodule bakoitzean komando
+ bat executatzeko. Adibidez: `git submodule foreach 'git stash'`
+
+## Bundle
+
+Bundle-ak commitak edo repositorio osoak fitxategi baten bidez partekatzeko
+sistema dira.
+
+- `git bundle create <file> [<commit-selector>]` aukeratutako commitak (edo
+ guztiak) `<file>` fitxategian gorde, bundle formatoan. Normalean, `HEAD`
+ sartzea komeni da, gero bundle-a kargatzean repositorioa non zegoen jakiteko.
+
+- `git clone <bundle-file>` bundle fitxategitik clone bat egiteko. Bundle-a
+ repositorio osoa izan behar du.
+
+- `git bundle verify <bundle-file>` bundle partzial bat repositorio batean
+ aplikatu daitekeen konprobatzeko
+
+- `git bundle list-heads <bundle-file>` bundle fitxategiaren adarrak ikusteko
+
+- `git fetch/pull <bundle-file>` bundle fitxategitik repositorioa
+ berriztatzeko
+
+## Replace
+
+Giten datu basea orokorrean ezin da aldatu, baina `git replace`-en bitartez
+*replace* objektuak eratu daitezke, datu basea aldatu denaren itxura emango
+dutenak.
+
+- `git replace <object> <replacement>` aplikatzetik aurrera, `<object>`
+ erabiltzean `<replacement>` erabili balitz bezala funtzionatuko du
+
+*Erabileren adibide bat ikusteko liburuan ikusi, nahiko arraroa da hau ikustea*
+
+## Kredentzial sistema
+
+HTTP kredentziala erabiltzean, zerbitzariarekin egiten diren interakzio
+guztietan erabiltzailea eta pasahitza eskatzen du Gitek defektuz.
+Portaera konfiguratu daiteke:
+
+- `git config --global credential.helper <modua>`
+ 1. Beti eskatu (defektuz egiten dena)
+ 2. `cache` kredentzialak memorian mantendu 15 minutu
+ 3. `store` kredentzialak gorde
+
+Aukera gehiago dago (`--timeout`, neurrira egindako kredentzial sistemak,
+etab.). *Interesa balego, liburuan begiratu*
+
+# Git konfigurazio aurreratua
+
+## Git konfigurazioa
+
+Konfigurazioaren dokumentazioa ikusteko `git help git-config`. Atal
+interesgarrienak:
+
+- Editorea eta paginadorea: `core.editor` eta `core.pager`
+- Commit mezuen txantiloia: `commit.template`
+- Merge eta diff tresnak: `merge.tool` eta `diff.tool`
+- Espazio hutsen kontrola: `core.autocrlf` eta `core.whitespace`
+
+## Git attribute-ak — I
+
+Proiektuen barruan, fitxategi mailan, Giten portaera aldatzeko erabiltzen dira
+atributuak (*attribute*).
+
+- `.gitattributes` fitxategian edo `.git/info/attributes` fitxategian,
+ repositorioarekin partekatu nahi ezbadira.
+
+Atributu fitxategia `.gitignore` fitxategiaren antzekoa da, baina lerro
+bakoitzean fitxategien izenen txantiloiaz aparte haien atributuak definitu
+behar dira. Askotan konfigurazio gehigarria behar da, *driver* programak
+definitzeko. Ikusi `git help attributes`.
+
+## Git attribute-ak — II
+
+Atributu mota asko dago, interesgarrienetarikoak:
+
+- `binary` fitxategiak binario moduan identifikatzeko
+- `diff=<iragazkia>` diff-a exekutatu baino lehen fitxategiak iragazki batetik
+ pasatzeko. Konfigurazio gehigarria behar da:
+ - `git config diff.<iragazkia>.textconv <programa>`
+ - Adibidez: `*.png diff=exif`
+ - `git config diff.exif.textconv exiftool`
+ png fitxategien estatistikak konparatzen dira, eta ez edukiak
+- `ident` identifikazioa gehitzeko. `$Id$` testu literala SHA-1era bihurtzen da
+ espantsio baten bitartez
+
+## Git attribute-ak — III
+
+- `filter` fitxategiak iragazki batekin prozesatzeko
+ - `smudge` *index*etik *working directory*rako bidean
+ - `clean` *working directory*tik *index*erako bidean
+ - Adibidez: `*.c filter=indent`
+ - `git config filter.indent.clean indent`
+ `git config filter.indent.smudge cat`
+ fitxategiak automatikoki indentatzeko `git add` egiterakoan
+- `export-ignore` artxibo (`git archive`) bat egiterakoan fitxategi batzuk
+ baztertzeko.
+- `export-subst` artxibo bat egiterakoan `git log`-ek aplikatzen dituen
+ espantsioak aplikatzeko
+- `merge` merge estrategiak aukeratzeko
+
+
+## Git hooks
+
+Hookak gertaera garrantzitsuak gertatzen direnean exekutatzen diren programak
+dira. Askotan erabiltzen dira.
+
+- `.git/hooks` direktorioan idazten dira, izen konkretu batekin eta exekuzio
+ baimenekin
+
+Defektuz, `git init` egiterakoan hook batzuk idazten dira, baina desaktibatuta
+daude (haien izena `.sample`-n bukatzen delako). Erreferentzia moduan hartu
+daitezke haien funtzionamendua ulertzeko.
+
+
+## Bezero aldeko hookak
+
+Bakoitzarentzako bakarrik. **Ez dira kopiatzen repositorioarekin
+batera**[^hookak-partekatu].
+Interesgarriak dira garatzaileei alertak botatzeko: testak ez direla pasatu,
+formaturen bat txarto dagoela adierazteko, etab. Interesgarri batzuk:
+
+- `pre-commit` commit mezua idatzi baino lehen exekutatzen da, zeozer ahaztu
+ den konprobatzeko erabili ohi da
+- `prepare-commit-msg` defektuzko commit mezua aldatzeko erabiltzaileak ikusi
+ baino lehen. Informazio gehigarriak sartu ahal zaio horrela, edo txantiloia
+ aldatu...
+- `commit-msg` commit mezua aztertzen duen hooka. Txarto badago commita atzera
+ bota dezake. Normalean commitaren mezua txantiloi konkretu bat jarraitzeko
+ erabiltzen da.
+
+[^hookak-partekatu]: Tresna batzuek mekanismoak dauzkate hook hauek
+ partekatzeko, baina hau ez da Giten defektuzko funtzionamendua. Kontuz
+ workflow guztia honetan oinarritzearekin.
+
+## Zerbitzari aldeko hookak
+
+Politikak inposatzeko aproposak dira, txarto badoaz `push` egiteko eskaerak
+atzera bota ditzaketelako. Interesgarri batzuk:
+
+- `pre-receive` push bat jasotzean erreferentzia guztiak jasotzen dituen
+ programa, errorea ematen badu ez da ezer berriztuko.
+- `update` aurrekoaren antzekoa da, baina behin exekutatzen da adar bakoitzeko
+- `post-receive` dena ondo jaso eta gero exekutatzen da, notifikazio moduan
+ erabili daiteke
+
+
+# Git barrutik
+
+## Git barrutik: Sarrera
+
+Git maila baxuko tresna bat da, eta maila horretan lan egiteko komandoak ditu,
+*plumbing* deiturikoak. Orain arte erabilitakoak *porcelain* deitzen dira,
+maila altuan lan egiten dutelako.
+
+Git *content-addressing* aplikatzen duen datu base bat da, hau da, *Key-Value*
+moduan gordetzen dira elementuak, non Key-a Valuaren edukiaren araberakoa den.
+Orain arte ikusi da: elementuak haien edukiaren SHA-1 hasharen bitartez
+identifikatzen dira.
+
+Eduki guzti hau `.git` karpetan gordetzen da. Baina elementu mota ezberdinak
+daude.
+
+## Giten gordetzen diren elementu motak
+
+Bi elementu mota nagusiak daude Git datu basean:
+
+- Objektuak: edukiak dauzkaten elementuak dira: commitak, blobak, zuhaitzak,
+ etab
+- Erreferentziak: beste elementuei apuntatzen duten elementuak dira: adarrak,
+ lightweight tagak, etab
+
+
+## Objektuak
+
+`.git/objects`-en gordetzen dira, haien hasharen arabera. Lehengo bi
+karaktereak direktorio moduan eta hurrengoak fitxategi moduan.
+Adibidez: `.git/objects/cf/6cbb8a400c7cad0f7f93610366c3672f598cdd`
+
+- `git hash-object -w`-rekin idatzi daitezke (bueltan hash-a ematen du)
+- `git cat-file`-ekin irakurri daitezke. `-p` egin emaitza **p**olita ikusteko.
+
+## Objektu motak
+
+`git cat-file -t`-rekin mota ikusi daiteke.
+
+- `blob`-ak fitxategien edukiak eta bestelako datuak gordetzeko
+- `tree` fitxategien izenak eta direktorioak gordetzeko
+ Sarrera bat edo gehiago dute beste `tree` edo `blob`etara haien izena eta
+ hasha identifikatuz.
+- `commit` commit datuak gordetzeko: `tree` bat snapshotarekin, mezua, autorea,
+ etab.
+
+## Objektu motak: tree
+
+![](img/data-model-1.png)
+
+## Objektu motak: commit
+
+![](img/data-model-3.png)
+
+## Erreferentziak
+
+Haien barruan identifikadore bat baino ez dago.
+
+- `git update-ref` edukia aldatzeko. Eskuz ere egin daiteke.
+
+Erreferentzia mota ezberdinak daude:
+
+- Tag-ak: `.git/refs/tag` karpetan. Edozein objetu tageatu
+ daiteke (normalean commitak). Bi mota dago:
+ - Lightweight tag: erreferentzia bat baino ez dira
+ - Annotated tag: tag *objektu* bat eratzen dute eta erreferentzia bat
+ idazten dute bertara
+- Adarrak: `.git/refs/heads` karpetan. Commit-id batera erreferentzia
+ egiten dute.
+- Remote-ak: `.git/refs/remotes` karpetan. Adarren antzerakoak baina ezin dira
+ aldatu.
+- HEAD-a: `.git/HEAD`-en dago. Adar batera apuntatzen du, baina batzutan commit
+ batera apuntatu dezake (*Detached HEAD*).
+
+## Erreferentziak: adarrak
+
+![](img/data-model-4.png)
+
+## Ariketa: Notak
+
+- `git notes` komandoarekin kudeatzen dira.
+
+*Aztertu zer diren eta nola funtzionatzen duten. Ikusi `git help git-notes`*
+
+## Packfile-ak
+
+Datuen egitura efizienteagoa egiteko Gitek fitxategiak konprimatzen ditu, baina
+hori ez da normalean nahikoa izaten.
+
+Git snapshotetan oinarritzen da, baina ez ditu fitxategi osoak behin eta
+berriro idazten commit bakoitzean, aldaketak baino ez ditu gordetzen.
+
+Gainera fitxategiak taldekatu eta *packfile* deituriko fitxategietan gordetzen
+ditu prozesua arintzeko.
+
+- `.git/objects/pack`-en ikusi daitezke
+- `git gc` (*garbage collector*) fitxategiak taldekatu eta konprimatzeko (berak
+ bakarrik exekutatzen du beharrezkoa ikusten duenean)
+- `git verify-pack` *packfile* baten edukia aztertzeko eta egiaztatzeko
+
+## Mantenamendua eta datuak berreskuratzea
+
+- `git gc --auto`-k packfileak berrorganizatzen ditu.
+- `git reflog`-en HEAD-ean egindako aldaketak gordetzen dira, beraz commiten
+ bat galdu bada bertara salto egin daiteke, `reflog`a begiratu eta commita
+ berreskuratu daiteke.
+- `git fsck --full` galdutako elementuak erakusten ditu, bertatik ere
+ datuak berreskuratu daitezke
+
+*ARIKETA: Fitxategi handiak nahi gabe gehitzea arazo bat da, `git rm`-k ez
+dituelako ezabatzen. Nola egiten da? Zergatik?*
+
+## Refspec-a
+
+Lokalaren eta remotearen arteko adarren mapeoa kudeatzeko. `.git/config`-en
+edukia `git remote add origin https://github.com/schacon/simplegit-progit` egin
+eta gero:
+
+```
+[remote "origin"]
+ url = https://github.com/schacon/simplegit-progit
+ fetch = +refs/heads/*:refs/remotes/origin/*
+```
+
+`fetch` atalak **refspec** baten bitartez adarrak nola kudeatu behar diren
+adierazten du. Sarrera asko egon daitezke arau ezberdinekin. Formatua:
+
+- Aukerako `+` bat *fast forward* ez direnean ere berrizteko
+- `<iturria>:<helmuga>` nola mapeatu behar diren adierazteko. `<iturria>`
+ eta `<helmuga>` patroiak dira (`*`)
+
+## Refspec-a eskuz erabiltzen
+
+`git fetch/push` egitean refspec patroia (1 edo +) gehitu ahal da *"hau hona"*
+eta *"beste hau hona"* esateko.
+
+Refspec-a ikusita, Gitek adarren adierazpenaren espantsioa egiten du:
+
+- `git log origin/master`
+ => `git log remotes/origin/master`
+ => `git log refs/remotes/origin/master`
+
+Adarrak ezabatzeko lehen refspec-a erabili behar zen:
+
+- `git push :<adarra>` iturri atala utzik uztean, remotean adarra ezabatzen zen
+- Orain `git push --delete <adarra>` egin daiteke
+