From 270b0e15c843ace238a2b12b9d6089ec76dbff26 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Fri, 3 Jun 2022 21:00:26 +0200 Subject: finish first version --- 2.md | 370 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 370 insertions(+) (limited to '2.md') 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 ` - 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 ` 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 ` 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 ` submoduluen edukiak berrizteko + edo bestela submoduluaren barruan `fetch`+`merge` egin daiteke. +- `git config -f .gitmodules submodule..branch ` 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 && git checkout ` + 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 ` 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 []` aukeratutako commitak (edo + guztiak) `` fitxategian gorde, bundle formatoan. Normalean, `HEAD` + sartzea komeni da, gero bundle-a kargatzean repositorioa non zegoen jakiteko. + +- `git clone ` bundle fitxategitik clone bat egiteko. Bundle-a + repositorio osoa izan behar du. + +- `git bundle verify ` bundle partzial bat repositorio batean + aplikatu daitekeen konprobatzeko + +- `git bundle list-heads ` bundle fitxategiaren adarrak ikusteko + +- `git fetch/pull ` 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 ` aplikatzetik aurrera, `` + erabiltzean `` 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 ` + 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=` diff-a exekutatu baino lehen fitxategiak iragazki batetik + pasatzeko. Konfigurazio gehigarria behar da: + - `git config diff..textconv ` + - 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 +- `:` nola mapeatu behar diren adierazteko. `` + eta `` 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 :` iturri atala utzik uztean, remotean adarra ezabatzen zen +- Orain `git push --delete ` egin daiteke + -- cgit v1.2.3