Тема лабораторной
На этой короткой домашней практической вы научитесь работать с системой контроля версий git. Системы контроля версий (Version Control Systems, аббр. VCS) постоянно используются во время разработки софтвера, их ценность сложно переоценить при работе в командах из разработчиков. Поэтому можно сказать, что уметь грамотно использовать git - одно из самых главных умений любого разработчика.
Для сбора и оценивания большинства ваших проектов мы будем использовать VCS git, который станет неотъемлемой частью этого предмета.
Цели
- Познакомиться с основами работы git.
- Познакомиться с основами работы системы GitLab.
- Научиться манипулировать своими 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 выдаст ошибку при попытке добавления ключа по причине:
- некорректного копирования из putty
- ключ, который вы пытаетесь добавить, уже находится в системе
- вы скопировали не SSH ключ
Предупреждение
Отмените срок действия ключа или установите подходящую дату.
Шаг 2: New Project
Задача 2.1
Создайте проект через приложение ZAP Gitlab Classroom, выполнив следующие действия.
- Перейдите по ссылке на GitLab чтобы авторизовать приложение ZAP GitLab Classroom, созданное для вас Менеджером.
- Авторизовав приложение, вы будете перенаправлены на страницу создания проекта ZAP 2024, где вам будет нужно выбрать учебную группу, которую вы посещаете, в соответствии с вашим расписанием. Группы перечислены в виде
<group> - <day> <time>
. - Нажав на кнопку для создания проекта покажет вам ссылку на ваш новосозданный проект. Вы можете найти свой проект среди ваших проектов в GitLab.
Задача 2.2
Создайте начальную версию проекта в вашей среде разработки и отправьте её на сервер git.
Последовательность команд, нужная для выполнения задачи, находится прямо на странице, на которую вы перейдёте после создания проекта. Скопируйте данные команды и запустите в терминале.
Предупреждение
Проект не отправится в случае появления ошибки. В таком случае (при условии, что вы все перед этим выполняли верно) проблема может быть неправильный SSH ключ или отсутствие подключения к Интернету.
Процесс коммуникации с сервером может быть примерно в таком виде (ввод пользователя выделен жирным шрифтом, а $ представляет командную строку):
$ 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
), находящиеся в проекте.
Комментарий
Если у вас уже есть существующий проект на 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.
- Команду
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
проблема должна быть решена.
Дополнительные источники
- Pro Git Book - вторая глава
- Университетский GitLab сервер