Version Control (RU)

VCS git, система GitLab

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

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

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

Objectives

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

Postup

Step 1: GitLab & SSH Keys

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

Task 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 приватный ключ

Task 1.2

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

Task 1.3

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

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

cat ~/.ssh/id_rsa.pub

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

Список ключей на сервере GitLab. Ключей может быть больше одного.
Obr. 1: Список ключей на сервере GitLab. Ключей может быть больше одного.

Warning

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

Step 2: New Project

Task 2.1

Создайте на GitLab новый проект с названием zap-2018.

Создайте проект из меню Go to dashboard, кликнув на + New Project или перейдите прямо по ссылке git.kpi.fei.tuke.sk/projects/new.

Warning

В данный проект вы будете систематически сдавать выполненные задания. Название проекта очень важно и должно соответствовать формату. Если назовёте свой проект иначе, ваши задания не будут проходить проверку!
Форма для создания нового проекта.
Obr. 2: Форма для создания нового проекта.

Warning

Не забудьте обозначить ваш проект как приватный. В ином случае, ваш код сможет посмотреть кто угодно, что приведёт к возможной схожести чужого кода с вашим.
После создания вы увидите следующее:
Obr. 3: После создания вы увидите следующее:

Task 2.2

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

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

Warning

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

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

$ 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'.

Task 2.3

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

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

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

Comment

Если у вас уже есть существующий проект на GitLab-e и вы хотите продолжать разработку на вашем компьютере, на котором вы не создавали проект, вы его можете скачать с сервера с помощью команды clone в формате:
git clone git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.git

в котором git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.git представляет собой адрес проекта на сервере GitLab.

Comment

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

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

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

Comment

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

Task 3.1

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

Task 3.2

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

Task 3.3

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

Task 3.4

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

Step 4: Project Testing

Task 4.1

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

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

git status

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

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

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

git add ps1/task_1.c

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

GROUP : C1

Warning

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

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

touch ps1/task_2.c
touch ps1/README

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

PROBLEM : 3

Warning

У каждого из вас разный номер задания (problem). Обратите на это внимании при указании в файле.

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

$ 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

Task 4.2

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

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

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

Comment

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

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

$ 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

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

Файлы на GitLab после загрузки.
Obr. 5: Файлы на 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 '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'

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

git remote add origin git@git.kpi.fei.tuke.sk:ab123xy/zap-2018.git
git push -u origin master

Everything up-to-date

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

Everything up-to-date

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

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

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

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.

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

Именно поэтому вас следует данные две версии соединить (выполнить процедуру 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 проблема должна быть решена.

Additional Resources

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