O čom je lab
Na tomto krátkom domácom cvičení sa naučíte základy používania systému na správu verzií git. Systémy na správu verzií (Version Control Systems, skrátene VCS) sa používajú bežne počas vývoja softvéru a sú neoceniteľným pomocníkom pri práci v tímoch. Preto je možné povedať, že znalosť používania týchto systémov patrí medzi základné znalosti každého vývojára.
Na preberanie a hodnotenie väčšiny Vašich zadaní budeme používať VCS systém git, takže sa stane neoddeliteľnou súčasťou tohto kurzu.
Ciele
- Naučiť sa základy práce so systémom na správu verzií git.
- Naučiť sa základy práce v systéme GitLab.
- Naučiť sa spravovať svoje SSH kľúče pomocou príkazu
ssh-keygen
.
Postup
Krok 1: GitLab & SSH Keys
V tomto kroku si vytvoríte účet na školskom GitLab serveri a potrebné SSH kľúče. Pomocou nich sa budete vedieť identifikovať, keď budete komunikovať so serverom git zo svojho pracovného prostredia.
Úloha 1.1
Vytvorte si vlastné SSH kľúče vo Vašom pracovnom prostredí.
Kľúče si vytvoríte pomocou príkazu ssh-keygen
. Po jeho spustení nezadávajte žiadne ďalšie údaje! (zadávajte len Enter
.) Konkrétne sa Vás nástroj bude pýtať na alternatívne umiestnenie vygenerovaných kľúčov a na bezpečnostnostnú frázu. Ukážka výstupu po spustení tohto príkazu môže byť nasledovná, pričom vstup od používateľa je zvýraznený tučne a riadok začínajúci znakom $ predstavuje príkazový riadok:
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/john/.ssh/id_rsa): Created directory '/home/john/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/john/.ssh/id_rsa. Your public key has been saved in /home/john/.ssh/id_rsa.pub. The key fingerprint is: eb:80:f3:1f:36:02:38:7c:7a:9d:64:e8:8c:6b:5a:eb john@machine The key's randomart image is: +---[RSA 2048]----+ |oo++ o= . | |o++ oo=+o | |+oo..oo*.. | |. + .oo=.E | | . . .oS+o. | | . ... =o | | . oo. . o | | o . .o+ .. | |..o.. ..o... | +----[SHA256]-----+
Vytvorené kľúče budú uložené v priečinku .ssh/
vo Vašom domovskom priečinku (čiže ~/.ssh/
). Dôjde k vytvoreniu dvoch súborov:
id_rsa.pub
Váš verejný kľúčid_rsa
Váš súkromný (privátny) kľúč
Poznámka
Ak máte túto chybu: Saving key "/home/ab123xy/.ssh/id_rsa" failed: No such file or directory
, najskôr vytvorte adresár ~/.ssh/
pomocou príkazu mkdir ~/.ssh/
a potom opäť zadajte príkaz ssh-keygen
pre generovanie ssh kľúčov.
Úloha 1.2
Pomocou Vášho univerzitného účtu sa prihláste na školský GitLab server, ktorý sa nachádza na adrese git.kpi.fei.tuke.sk.
Úloha 1.3
Váš verejný kľúč, ktorý ste pred chvíľou vygenerovali, pridajte do zoznamu kľúčov nachádzajúcich sa na serveri git.kpi.fei.tuke.sk.
Verejný kľúč si najskôr zobrazte:
cat ~/.ssh/id_rsa.pub
Celý obsah súboru s kľúčom označte a skopírujte ho do schránky (skratka: Ctrl+Shift+C
). Na stránku so zoznamom Vašich kľúčov sa dostanete postupne cez Edit Profile (vľavo hore) > SSH Keys alebo (ak ste prihlásený) rovno prejdite na odkaz git.kpi.fei.tuke.sk/-/user_settings/ssh_keys.
Upozornenie
Môže sa stať, že GitLab odmietne pridať kľúč z dôvodu:
- nesprávneho kopírovania z putty (treba zrušiť zalomenia riadkov)
- existencie rovnakého kľúča
- bol prekopírovaný reťazec, ktorý nie je SSH kľúč
Upozornenie
Zrušte expiráciu kľúča alebo nastavte vhodný dátum.
Krok 2: New Project
Úloha 2.1
Vytvorte si v GitLab-e nový projekt prostredníctvom aplikácie ZAP Gitlab Classroom podľa uvedeného postupu.
- Kliknutím na uvedený odkaz budete v GitLab-e vyzvaní na autorizáciu aplikácie ZAP GitLab Classroom, ktorú pre Vás pripravil Manager.
- Autorizovaním aplikácie budete presmerovaní na stránku vytvárania projektov ZAP 2024, kde si zvolíte skupinu podľa rozvrhovej jednotky (zobrazenej v tvare
<skupina> - <deň> <čas>
), ktorú v rámci predmetu navštevujete. - Kliknutím na tlačidlo pre vytvorenie projektu sa pre vás zobrazí link na váš novovytvorený projekt. Projekt taktiež nájdete medzi vašimi projektami v GitLab-e.
Úloha 2.2
Vytvorte si počiatočnú verziu projektu vo Vašom pracovnom prostredí a odošlite ju do git-u.
Postupnosť krokov, ktoré je potrebné vykonať na to, aby ste vytvorili počiatočnú verziu svojho projektu, sa nachádza priamo na stránke, ktorá sa zobrazila po procese vytvorenia projektu na serveri GitLab. Tieto kroky len prekopírujte a spustite ich vo Vašom prostredí z príkazového riadku.
Upozornenie
V prípade výskytu problému nedôjde k odoslaniu projektu do git-u. V tomto prípade (ak ste kopírovali a vkladali text zo stránky projektu) môže byť jediným problémom len nesprávny SSH kľúč (alebo žiadne sieťové spojenie).
Komunikácia so serverom môže byť nasledovná, pričom vstup od používateľa je zvýraznený tučne a riadok začínajúci znakom $ predstavuje príkazový riadok:
$ git config --global user.name "Your Name" (CHANGE YOUR NAME) $ git config --global user.email "your.email@student.tuke.sk" (CHANGE YOUR EMAIL) $ git clone git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git (CHANGE YOUR ID NUMBER) Cloning into 'zap-2024-id'... warning: You appear to have cloned an empty repository. Checking connectivity... done. $ cd zap-2024-id (CHANGE YOUR ID NUMBER) $ git switch -c main $ touch README $ git add README $ git commit -m "add README" [main (root-commit) 2859d11] add README 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README $ git push -u origin main __ ___ .______ __ | |/ / | _ \ | | Katedra pocitacov a informatiky | ' / | |_) | | | Fakulta elektrotechniky a informatiky | < | ___/ | | Technicka Univerzita v Kosiciach | . \ | | | | |__|\__\ | _| |__| Internal git repository UNAUTHORIZED ACCESS TO THIS NETWORK DEVICE IS PROHIBITED. You must have explicit permission to access or configure this device. All activities performed on this device are logged and violations of this policy will be prosecuted under all applicable statutes plus all applicable civil rules for damages. Counting objects: 3, done. Writing objects: 100% (3/3), 230 bytes | 230.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git * [new branch] main -> main Branch 'main' set up to track remote branch 'main' from 'origin'.
Poznámka
Chyba fatal: --local can only be used inside a git repository
znamená, že ste použili --local
mimo repozitára. Namiesto --local
použite --global
alebo zadajte pôvodný príkaz s --local
až po vytvorení repozitára, vnútri repozitára.
Upozornenie
Ak bola vytvorená vetva master, použite príkaz git push -u origin master
.
Úloha 2.3
Overte stav projektu na serveri GitLab.
Ak ste postupovali správne, po zobrazení stránky s projektom v GitLab-e a prejdení do časti Files sa Vám zobrazia súbory (v tomto prípade len súbor README
), ktoré sú obsahom projektu.
Poznámka
Ak už budete mať verziu v repozitári na GitLab-e a budete chcieť pokračovať vo vývoji na počítači, na ktorom ste projekt nevytvárali, stiahnete si ho pomocou príkazu clone
v tvare:
git clone git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git
kde git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git predstavuje adresu projektu na GitLab-e.
Poznámka
Pri práci na projekte odporúčame osvojiť si nasledovný všeobecný postup:
- Predtým, ako začnete pokračovať v prácach na projekte, začnite svoju prácu príkazom:
git pull
Tým zabezpečíte, že sa lokálna kópia Vášho projektu zosynchronizuje s verziou nachádzajúcou sa vo vzdialenom repozitári (na serveri git).
- Programujte.
- Po vykonaní všetkých úprav a ukončení programovania svoje vykonané zmeny potvrďte v lokálnom repozitári ("commitnite") príkazom:
git commit -am "sprava"
Potom svoje vykonané zmeny odošlite do vzdialeného repozitára príkazom:
git push
Tentokrát síce budete projekt vytvárať sami, a teda by ste mali mať prehľad o jednotlivých zmenách, ale tento prístup oceníte práve v prípade tímovej práce. Preto: Čím skôr si tento prístup osvojíte, tým lepšie.
Krok 3: Orientačný beh
V tomto kroku sa pokúsite vyriešiť prvú úlohu zadania PS1, ktoré Vás čaká. Kompletné znenie zadania nájdete na tejto stránke.
Poznámka
Dôraz tejto úlohy je kladený na predchádzajúcu časť: Zoznámenie sa so systémom na správu verzií git, a nasledujúcu časť: Nahratie zmien projektu na server GitLab.
Úloha 3.1
Vo Vašom repozitári vytvorte nový adresár s názvom ps1
a premiestnite sa do tohto adresára.
mkdir ps1
cd ps1
Úloha 3.2
V tomto adresári vytvorte súbor s názvom task_1.c
, do ktorého naprogramujete prvú časť Vášho zadania.
touch task_1.c
Úloha 3.3
V súbore task_1.c
vytvorte program, ktorý bude predstavovať riešenie Úlohy 1 zadania s názvom Orientačný beh.
Úloha 3.4
Overte správnosť svojho riešenia pre rozličnú kombináciu máp.
Krok 4: Project Testing
Úloha 4.1
Vo svojom projekte vytvorte štruktúru súborov a priečinkov tak, ako je to uvedené v požiadavkách pre zadanie PS1.
Ak spravíte vo svojom projekte zmenu, jeho aktuálny stav si viete zobraziť pomocou príkazu:
git status
Po vytvorení programu task_1.c
môže výstup tohto príkazu vyzerať nasledovne, pričom vstup od používateľa je zvýraznený tučne a riadok začínajúci znakom $ predstavuje príkazový riadok:
$ git status On branch main Your branch is up-to-date with 'origin/main'. Untracked files: (use "git add..." to include in what will be committed) ps1/task_1.c nothing added to commit but untracked files present (use "git add" to track)
Ak chcete do projektu pridať súbor task_1.c
, použite príkaz:
git add ps1/task_1.c
Na základe požiadaviek PS1 je potrebné modifikovať súbor README
nasledovne:
GROUP : C1
Upozornenie
Každý z Vás navštevuje inú študijnú skupinu! Preto uveďte správne číslo skupiny!
Na základe požiadaviek PS1 je potrebné vytvoriť aj súbory ps1/task_2.c
... ps1/task_7.c
. Na vytvorenie prázdneho súboru použite príkaz:
touch ps1/task_2.c
Ak si overíte Vaše zmeny, výstup môže vyzerať nasledovne, pričom vstup od používateľa je zvýraznený tučne a riadok začínajúci znakom $ predstavuje príkazový riadok:
$ git status On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git reset HEAD..." to unstage) new file: ps1/task_1.c Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: README Untracked files: (use "git add ..." to include in what will be committed) ps1/task_2.c ps1/task_3.c ps1/task_4.c ps1/task_5.c ps1/task_6.c ps1/task_7.c
Úloha 4.2
Odošlite svoj aktuálny projekt do git-u a sledujte na obrazovke výstup servera.
Odosielanie projektu na server sa vykonáva v dvoch fázach:
- Najskôr pomocou príkazu
git commit -am "message"
odošlete vykonané zmeny do lokálneho repozitára. Pri commitovaní predstavuje prepínač-am "message"
odoslanie všetkých vykonaných zmien a zároveň bude táto zmena označená správou message. - Následne pomocou príkazu
git push
odošlete všetky vykonané zmeny na vzdialený git server.
Poznámka
Pri odosielaní projektu je potrebné uviesť správu, ktorá charakterizuje Vaše vykonané zmeny. Zoznam týchto správ následne môžete vidieť priamo na serveri GitLab alebo na konzole po zadaní príkazu:
git log
Príklad uvedenej komunikácie pomocou príkazov git commit
a git push
môže vyzerať nasledovne:
$ git add ps1/task_2.c ps1/task_3.c ps1/task_4.c ps1/task_5.c ps1/task_6.c ps1/task_7.c $ git commit -am "inicializacia projektu" [main 4d97a92] inicializacia projektu 4 files changed, 2 insertions(+) create mode 100644 ps1/README create mode 100644 ps1/task_1.c create mode 100644 ps1/task_2.c $ git push __ ___ .______ __ | |/ / | _ \ | | Katedra pocitacov a informatiky | ' / | |_) | | | Fakulta elektrotechniky a informatiky | < | ___/ | | Technicka Univerzita v Kosiciach | . \ | | | | |__|\__\ | _| |__| Internal git repository UNAUTHORIZED ACCESS TO THIS NETWORK DEVICE IS PROHIBITED. You must have explicit permission to access or configure this device. All activities performed on this device are logged and violations of this policy will be prosecuted under all applicable statutes plus all applicable civil rules for damages. Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (5/5), 414 bytes | 414.00 KiB/s, done. Total 5 (delta 0), reused 0 (delta 0) To git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git 2859d11..4d97a92 main -> main
Po úspešnom odoslaní projektu skontrolujte jeho stav na stránke projektu v GitLab-e.
- Príkaz
git commit
je možné použiť viackrát - zmeny sa odosielajú len do lokálneho repozitáru. S výhodou sa táto vlastnosť dá použiť pri práci bez sieťového pripojenia. - Parametrom commit-u je správa, ktorú je potrebné zadať, a ktorá sa zobrazí pri commit-och v GitLab-e, prípadne po zadaní príkazu
git log
. - Po spustení automatického testovania Vám príde na Váš školský email správa s adresou, na ktorej si môžete pozrieť výsledky tohto testovania. Všetky ďalšie testy sa budú nachádzať na rovnakej adrese.
FAQ
Kľúč nejde pridať
Ak Váš verejný kľúč nejde pridať do zoznamu kľúčov na serveri GitLab, skontrolujte, či ste odstránili zalomenia riadkov, ku ktorým dochádza najmä pri kopírovaní verejného kľúča prostredníctvom nástroja PuTTY.
Moje zadanie nie je testované
Ak po vykonaní zmien v programe a vykonaní operácii commit
nie je Vaše zadanie vyhodnotené, príkazom commit
ste vykonali len zmenu v lokálnej verzii repozitára. Musíte ešte vykonať príkaz push
, aby ste svoj projekt aktualizovali aj na vzdialenom repozitári.
Server vyžaduje heslo
Ak pri operácii push
server vráti nasledovnú výzvu:
$ git push git@git.kpi.fei.tuke.sk's password:
Skontrolujte, či ste na serveri GitLab pridali Váš verejný kľúč. Ak nie, pridajte ho. V prípade, že ste kľúč už pridávali a aj tak server od vás heslo vyžaduje, skopírujte ho, odstráňte a pridajte znova.
The authenticity of host can't be established.
Ak sa pri kontaktovaní servera objaví nasledujúca hláška, pridajte server medzi známe adresy príkazom yes:
The authenticity of host 'git.kpi.fei.tuke.sk (147.232.41.222)' can't be established. ECDSA key fingerprint is SHA256:veLrTYwHRhyrPY6h/X8uulGdcznHRlgIGEd+kP4PiP0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'git.kpi.fei.tuke.sk,147.232.41.222' (ECDSA) to the list of known hosts.
No refs in common and none specified; doing nothing.
Ak pri pokuse o operáciu push
dôjde k nasledujúcej chybe:
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'main'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git'
Skontrolujte, či ste zadali posledné dva príkazy úvodných pokynov k projektu (platí pre nový aj existujúci repozitár):
git remote add origin git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git
git push -u origin main
Everything up-to-date
PAk po vykonaní zmien v programe a následnej operácii push
server oznámi:
Everything up-to-date
Pred použitím príkazu push
ste zabudli na použitie príkazu commit
.
! [rejected] main -> main (non-fast-forward)
Ak po vykonaní zmien v programe a spustení príkazu push
dostanete zo servera nasledujúcu správu:
To git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-den-cas/zap-2024-id.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
Tento problém je spôsobený tým, že ste zmeny v projekte vykonali aj z iného miesta alebo počítača, a v repozitári sa nachádza novšia verzia projektu ako tá, ktorú máte lokálne na počítači.
Preto potrebujete tieto dve verzie spojiť (vykonať operáciu merge
). Git sa pokúsi toto spojenie vykonať za Vás, pokiaľ sa bude vedieť správne rozhodnúť. Toto viete zabezpečiť spustením príkazu:
git pull
Pokiaľ Git dokázal obe verzie projektov spojiť sám, je možné následne vykonať operáciu push
, čím dôjde k aktualizácii verzie projektu na vzdialenom repozitári.
nothing added to commit
Ak po vytvorení nového súboru a vykonaní operácie commit
Git vypíše nasledujúcu hlášku:
nothing added to commit but untracked files present (use "git add" to track)
Zabudli ste pridať nový súbor do projektu pomocou príkazu add
. Po jeho pridaní a zavolaní príkazu commit
bude tento problém vyriešený.
Doplňujúce zdroje
- Pro Git Book - druhá kapitola
- Školský GitLab server