3. неделя

Version Control

VCS git, система GitLab

Тема лабораторной

На этой короткой домашней практической вы научитесь работать с системой контроля версий git. Системы контроля версий (Version Control Systems, аббр. VCS) постоянно используются во время разработки софтвера, их ценность сложно переоценить при работе в командах из разработчиков. Поэтому можно сказать, что уметь грамотно использовать git - одно из самых главных умений любого разработчика.

Для сбора и оценивания большинства ваших проектов мы будем использовать VCS git, который станет неотъемлемой частью этого предмета.

Цели

  1. Познакомиться с основами работы git.
  2. Познакомиться с основами работы системы GitLab.
  3. Научиться манипулировать своими ssh ключами с помощью ssh-keygen .

Инструкции

Шаг 1: GitLab & SSH Keys

На этом этапе вы создадите свой аккаунт на GitLab сервера и нужные SSH ключи. С помощью данных ключей вас сможет опознать система во время коммуникации с сервером git со своей домашней рабочей среды разработки.

Задача 1.1

Сгенерируйте свои собственные SSH ключи в вашей среде разработки.

Генерация ключей осуществляется с помощью ssh-keygen. После запуска не задавайте дополнительные параметры! (нажимайте только Enter.) Более конкретно, утилита будет предлагать вам сохранить ключи в нестандартной локации и возможность добавить секретную фразу. Вывод программы может быть в таком виде, при этом те данные, которые вводил пользователь, выделены жирным шрифтом, а рядок, начинающийся $, представляет командную строку:

$ 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]-----+

По умолчанию сгенерированные ключи будут сохранены в директорию .ssh/ вашего домашнего каталога (т.е. ~/.ssh/). Создадутся два файла:

  • id_rsa.pub публичный ключ
  • id_rsa приватный ключ

Комментарий

Если у вас возникла эта ошибка: Saving key "/home/ab123xy/.ssh/id_rsa" failed: No such file or directory, сначала создайте каталог ~/.ssh/, используя команду mkdir ~/.ssh/, а затем снова введите команду ssh-keygen, чтобы сгенерировать ssh-ключи.

Задача 1.2

С помощью университетского аккаунта войдите на сервер git.kpi.fei.tuke.sk.

Задача 1.3

Добавьте ваш публичный ключ в список ключей на сервере git.kpi.fei.tuke.sk.

Для этого сначала выведите его на экран:

cat ~/.ssh/id_rsa.pub

Скопируйте содержимое файла с публичным ключом в буфер обмена (shortcut: Ctrl+Shift+C). Список ваших ключей находится на странице Edit Profile (вверху слева) > SSH Keys или же (если вы авторизованы на сайте) перейдите сразу по ссылке git.kpi.fei.tuke.sk/-/user_settings/ssh_keys.

Доступ к профилю пользователя на сервере GitLab.
Рис. 1: Доступ к профилю пользователя на сервере GitLab.

Добавление SSH ключа к серверу GitLab. Ключей может быть больше одного.
Рис. 2: Добавление SSH ключа к серверу GitLab. Ключей может быть больше одного.

Добавление SSH ключа к серверу GitLab. Ключей может быть больше одного.
Рис. 3: Добавление SSH ключа к серверу GitLab. Ключей может быть больше одного.

Срок действия ключа не истекает или вы назначаете подходящую дату. GitLab.
Рис. 4: Срок действия ключа не истекает или вы назначаете подходящую дату. GitLab.

Предупреждение

Возможно, GitLab выдаст ошибку при попытке добавления ключа по причине:

  • некорректного копирования из putty
  • ключ, который вы пытаетесь добавить, уже находится в системе
  • вы скопировали не SSH ключ

Предупреждение

Отмените срок действия ключа или установите подходящую дату.

Шаг 2: New Project

Задача 2.1

Создайте проект через приложение ZAP Gitlab Classroom, выполнив следующие действия.

  1. Перейдите по ссылке на GitLab чтобы авторизовать приложение ZAP GitLab Classroom, созданное для вас Менеджером.
  2. Авторизовав приложение, вы будете перенаправлены на страницу создания проекта ZAP 2024, где вам будет нужно выбрать учебную группу, которую вы посещаете, в соответствии с вашим расписанием. Группы перечислены в виде <group> - <day> <time>.
  3. Нажав на кнопку для создания проекта покажет вам ссылку на ваш новосозданный проект. Вы можете найти свой проект среди ваших проектов в GitLab.

Авторизация приложений ZAP GitLab Classroom
Рис. 5: Авторизация приложений ZAP GitLab Classroom

Страница для создания проектов ZAP 2024
Рис. 6: Страница для создания проектов ZAP 2024

Создание проекта ZAP 2024
Рис. 7: Создание проекта ZAP 2024

Ссылка на проект ZAP 2024
Рис. 8: Ссылка на проект ZAP 2024

GitLab Dashboard
Рис. 9: GitLab Dashboard

Задача 2.2

Создайте начальную версию проекта в вашей среде разработки и отправьте её на сервер git.

Последовательность команд, нужная для выполнения задачи, находится прямо на странице, на которую вы перейдёте после создания проекта. Скопируйте данные команды и запустите в терминале.

Предупреждение

Проект не отправится в случае появления ошибки. В таком случае (при условии, что вы все перед этим выполняли верно) проблема может быть неправильный SSH ключ или отсутствие подключения к Интернету.

Последовательность шагов после создания проекта.
Рис. 10: Последовательность шагов после создания проекта.

Процесс коммуникации с сервером может быть примерно в таком виде (ввод пользователя выделен жирным шрифтом, а $ представляет командную строку):

$ 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-day-time/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-day-time/zap-2024-id.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

Комментарий

Ошибка fatal: --local can only be used inside a git repository означает, что вы использовали --local вне репозитория. Используйте --global вместо --local или введите исходную команду с --local только после создания репозитория внутри него.

Предупреждение

Если была создана ветка master, используйте команду git push -u origin master.

Задача 2.3

Проверьте состояние проекта на сервере GitLab.

Если вы делали все верно, после загрузки страницы проекта на GitLab-e и перехода во вкладку Files вы должны увидеть файлы (в нашем случае, пока только файл README), находящиеся в проекте.

Вид проекта после commit-а.
Рис. 11: Вид проекта после commit-а.

Комментарий

Если у вас уже есть существующий проект на GitLab-e и вы хотите продолжать разработку на вашем компьютере, на котором вы не создавали проект, вы его можете скачать с сервера с помощью команды clone в формате:

git clone git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-day-time/zap-2024-id.git

в котором git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-day-time/zap-2024-id.git представляет собой адрес проекта на сервере GitLab.

Комментарий

Для успешной работы с проектом мы рекомендуем закрепить общую последовательность команд:

  • Прежде чем продолжать разработку проекта, всегда скачивайте его актуальную версию с сервера с помощью команды:
git pull
  • Программируйте
  • При завершении работы, сохраните свой прогресс локально с помощью добавления коммита командой:
git commit -am "сообщение"

После этого отправьте локальные изменения на сервер:

git push

Хоть и в этот раз работой над проектом будете заниматься лишь, данный подход вы по-настоящему оцените при работе в команде. Именно поэтому: чем быстрее вы вникнитесь в него, тем лучше.

Шаг 3: Ориентированный забег

На этом этапе вы будете заниматься решением первой задачи в рамках задания PS1, которое вам предстоит сдать. Прочитать задание полностью.

Комментарий

Данная задача является продолжением предыдущие задачи (знакомство с git) - загрузка локальных изменений на сервер GitLab.

Задача 3.1

Создайте в вашем репозитории новый каталог ps1 и перейдите в него.

mkdir ps1
cd ps1

Задача 3.2

В данном каталоге создайте файл с именем task_1.c, в который поместите код для решения первой задачи.

touch task_1.c

Задача 3.3

В файле task_1.c поместите код программы для решения Задачи 1 задания с именем Ориентированный забег.

Задача 3.4

Проверьте свою имплементацию на разных комбинациях карт.

Шаг 4: Project Testing

Задача 4.1

В проекте придерживайтесь иерархии файлов, описанной требованиях к PS1.

Если сделайте в проекте изменение, его можно отследить с помощью:

git status

После завершения написания кода task_1.c вывод данной команды может выглядеть следующим образом, при этом ввод пользователя выделен жирным шрифтом, а $ представляет командную строку:

$ 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)

Если вы хотите добавить файл task_1.c в проект, воспользуйтесь командой:

git add ps1/task_1.c

Согласно требованиям задания PS1, вас нужно изменить файл README следующим образом:

GROUP : C1

Предупреждение

У каждого из вас разная группа! Поэтому обратите на это внимание при её указании в файле!

Согласно требованиям задания PS1, также нужно создать файлы ps1/task_2.c ... ps1/task_7.c. Для создания пустых файлов используйте:

touch ps1/task_2.c

Ak si overíte Vaše zmeny, вывод команды может быть в следующем виде, при этом ввод пользователя выделен жирным шрифтом, а $ представляет командную строку:

$ 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

Задача 4.2

Отправьте локальные изменения на сервер git и следите за ответами с сервера на экране.

Загрузка не сервер проходит в 2 фазах:

  • Сперва командой git commit -am "message" сохраните изменения в локальном репозитории. После, процесс commit' a представляется параметром -am "message", при чём все изменения будут закреплены за сообщением message.
  • После командой git push отправьте все локальные коммит(-ы) на удалённый сервер.

Комментарий

При отправке проекта нужно прикрепить сообщение, которое будет отражать результат изменений. Список подобных сообщений к соответствующим коммитам вы можете посмотреть на сервере GitLab или в консоли с помощью команды:

git log

Примером упомянутой коммуникации с сервером с помощью команд git commit и git push может служить следующий вывод:

$ 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

После отправки локальных изменений на удалённый сервер, проверьте их на GitLab.

Файлы на GitLab после загрузки.
Рис. 12: Файлы на GitLab после загрузки.

Файлы на GitLab после загрузки.
Рис. 13: Файлы на GitLab после загрузки.

  • Команду git commit можно использовать много раз. Изменения сохраняются только в локальный репозиторий, именно поэтому это считается удобной опцией при работе, например, без подключения к Интернету.
  • Обязательным параметром к каждому коммиту является сообщение, отображающееся после при соответствующем коммите на GitLab, или же в выводе команды git log.
  • После запуска тестов, на ваш университетский электронный адрес придёт письмо со ссылкой, по которой вы можете перейти на страницу с результами тестирования. Результаты всех последующих тестов будут находится на этой же странице.

FAQ

Cannot add the key

Если вам не удаётся добавить свой ключ в список ключей на GitLab, удостоверьтесь, что вы удалили символы окончания строки, которые появляются в большинстве из-за копирования из программы PuTTY.

My project has not been tested

Если после изменений в коде и выполнения команды commit ваше задание не прошло тестирование, это означает, что командой commit вы лишь сохранили изменения в локальный репозиторий, забыв послать их на удалённый сервер командой git push.

Server requires the passphrase

Если во время процедуры push сервер выдаёт следующее:

$ git push
git@git.kpi.fei.tuke.sk's password: 

Удостоверьтесь, добавили ли вы на сервер GitLab ваш публичный ключ. Если нет, то добавьте его. В случае, если свой ключ в список ключей на сервере вы уже добавляли, но сообщение повторяется, - повторите процесс удаления/добавления ключа на сервер.

The authenticity of host can't be established.

Если в процессе коммуникации с удалённым сервером вы получаете следующее сообщение, в ответе для сервера укажите 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.

Если в процессе выполнения команды push возникает следующая ошибка:

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-day-time/zap-2024-id.git'

Удостоверьтесь, что вы выполняли эти две команды, которые были указаны на стартовой странице (имеет значение для нового и уже существующего репозитория):

git remote add origin git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-day-time/zap-2024-id.git
git push -u origin main

Everything up-to-date

Если после выполнения локальных изменений и команды push сервер выдаёт:

Everything up-to-date

Перед использованием команды push вы забыли создать коммит командой commit.

! [rejected] main -> main (non-fast-forward)

Если после внесения изменений и выполнения команды push сервер возвращает следующее:

To git@git.kpi.fei.tuke.sk:zap-problemsets/2024/x0-day-time/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-day-time/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.

Данная проблема вызвана тем, что вы внесли изменения с другой машины, а локально у вас находится не самая актуальная версия репозитория.

Именно поэтому вас следует данные две версии соединить (выполнить процедуру merge). Git попробует сделать это автоматически за вас до тех пор, пока будет уверен в том, что "не поломает" поломает. Это можете сделать с помощью команды:

git pull

Если Git'у удалось соединить две версии самому автоматически, это означает, что теперь вы можете выполнить операцию push

nothing added to commit

Если при создании нового файла и выполнения команды commit Git выводит следующее:

nothing added to commit but untracked files present (use "git add" to track)

Это означает, что вы забыли добавить новый файл к проекту с помощью команды add. После добавления файла и выполнения команды commit проблема должна быть решена.

Дополнительные источники

  1. Pro Git Book - вторая глава
  2. Университетский GitLab сервер

Видео