Version Control

VCS git, systém GitLab

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ľúč

Ú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 Profile Settings (vľavo dole) > SSH Keys alebo (ak ste prihlásený) rovno prejdite na odkaz git.kpi.fei.tuke.sk/profile/keys.

Zoznam SSH kľúčov používateľa na serveri GitLab. Kľúčov môže byť viac ako jeden.
Obr. 1: Zoznam SSH kľúčov používateľa na serveri GitLab. Kľúčov môže byť viac ako jeden.

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ľúč

Krok 2: New Project

Úloha 2.1

Vytvorte si v GitLab-e nový projekt s názvom zap-2018.

Projekt vytvoríte v menu Go to dashboard kliknutím na ikonu + New Project alebo priamo prejdite na odkaz git.kpi.fei.tuke.sk/projects/new.

Upozornenie

V tomto projekte budete priebežne odovzdávať riešenia svojho zadania. Názov projektu je veľmi dôležitý a musí byť uvedený presne v takom tvare, v akom je požadovaný. Ak svoj projekt nazvete ináč, Vaše zadania nebudú vyhodnocované!
Formulár na vytvorenie nového projektu.
Obr. 2: Formulár na vytvorenie nového projektu.

Upozornenie

Nezabudnite Váš projekt označiť ako súkromný. Ak ho totiž označíte ináč, bude mať k Vášmu riešeniu prístup ktokoľvek, čo môže viesť k odcudzeniu Vášho riešenia a vysokej zhode pri kontrole originality.
Po úspešnom vytvorení projektu sa Vám zobrazia tieto pokyny.
Obr. 3: Po úspešnom vytvorení projektu sa Vám zobrazia tieto pokyny.

Ú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 clone git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.git
Cloning into 'zap-2018'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
$ cd zap-2018
$ touch README
$ git add README
$ git commit -m "add README"
[master (root-commit) 2859d11] add README
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git push -u origin master
 __  ___ .______    __
|  |/  / |   _  \  |  | 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:ab123xy/zap-2018.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

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

Stav projektu po prvom commit-e.
Obr. 4: Stav projektu po prvom commit-e.

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:ab123xy/zap-2018.git

kde git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.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 master
Your branch is up-to-date with 'origin/master'.

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 a ps1/README. Na vytvorenie prázdneho súboru použite príkaz:

touch ps1/task_2.c
touch ps1/README

Na základe požiadaviek PS1 je potrebné modifikovať súbor ps1/README nasledovne:

PROBLEM : 3

Upozornenie

Každý z Vás dostal pridelené iné číslo problému! Preto uveďte správne číslo problému.

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 master
Your branch is up to date with 'origin/master'.

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

Untracked files:
  (use "git add ..." to include in what will be committed)

    ps1/README
    ps1/task_2.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/README
$ git add ps1/task_2.c
$ git commit -am "inicializacia projektu"
[master 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:ep058uk/zap-2018.git
   2859d11..4d97a92  master -> master

Po úspešnom odoslaní projektu skontrolujte jeho stav na stránke projektu v GitLab-e.

Zoznam súborov po odoslaní do systému GitLab.
Obr. 5: Zoznam súborov po odoslaní do systému GitLab.
  • 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 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.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:ab123xy/zap-2018.git
git push -u origin master

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] master -> master (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:ab123xy/zap-2018.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.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

  1. Pro Git Book - druhá kapitola
  2. Školský GitLab server