0. Введение в Git

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

Максимальная оценка за работу — 1 балл. Срок выполнения — 1 неделя. Невыполненная или выполненная частично работа оценивается в 0 баллов без возможности пересдачи.

Цель работы

  1. Установить необходимое для работы ПО: git, текстовый редактор, clang-format.

  2. Выполнить базовую настройку рабочего окружения.

  3. Создать репозиторий с приложением «Hello, World», выполнить несколько коммитов, загрузить результат на GitHub.

Для получения инструкций по выполнению лабораторных работ смотрите раздел Руководство

Подготовка к работе

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

  1. Getting Started

  2. Git Basics

Вам понадобятся следующие команды:

  1. git clone — клонирование удаленного репозитория.

  2. git config — установка и получение глобальных или локальных параметров.

  3. git status — просмотр состояния файлов в локальном репозитории.

  4. git log — просмотр истории изменений.

  5. git add — индексация файлов.

  6. git commit — создание коммита.

  7. git push — обновление ссылок в удаленном репозитории.

Все работы выполняются в командной строке, в ОС Gnu/Linux. Основы работы в командной строке см. в Лабораторная работа 0. Знакомство с ОС GNU/Linux.

Полезные утилиты:

  1. man(1) — просмотр документации.

    Пример:

    man ls
    
  2. mkdir(1) — создание каталога.

    Пример:

    # Создание каталога myproject
    mkdir myproject
    
    # Создание каталога d и всех родительских каталогов
    # при необходимости
    mkdir -p a/b/c/d
    
  3. cd — изменение рабочего каталога. Описание команды расположено в man-странице bash(1).

    Пример:

    # Переход в каталог myproject
    cd myproject
    
    # Переход в домашний каталог
    cd
    
  4. ls(1) — просмотр списка файлов.

  5. touch(1) — создание файла.

Руководство

  1. Для создания репозитория пройдите по ссылке ЛР0: hw и выберите себя в списке. Если вас нет в списке, обратитесь к преподавателю практики.

  2. Для вас будет создан репозиторий с именем вида hw-<username>. Склонируйте его с помощью команды git clone

    $ git clone https://github.com/trpo2023/hw-<username>
    

    Проверьте наличие репозитория в домашнем каталоге:

    $ ls
    

    Перейдите в локальный репозиторий для дальнейшей работы:

    $ cd hw-<username>
    
  3. Для фиксации изменений в репозитории нужно указать свои имя и email. Подробности см. в 1.6 Getting Started - First-Time Git Setup. Обратите внимание, в каком файле хранятся параметры после их установки. Если вы не хотите публиковать свой email, ознакомьтесь с руководством: Setting your commit email address.

    Возможный вид команд:

    $ git config user.email <username>@users.noreply.github.com
    $ git config user.name "Ivan Ivanov"
    

Разработайте приложение «Hello, World». Выполните работу в несколько коммитов.

  1. В склонированном репозитории создайте пустой файл main.c. В каком состоянии он находится? Для просмотра состояния используйте команду git status.

  2. Проиндексируйте пустой файл main.c. Используйте команду git add. В каком состоянии находится файл?

  3. Зафиксируйте изменения с помощью команды git commit. В заголовке коммита укажите: «Create empty main.c».

    $ git commit -m "Create empty main.c"
    

    После создания коммита выполните команду git status, объясните вывод. Выполните команду git log, объясните вывод. Обратите внимание, что локальная ветка main теперь опережает удаленную origin/main на один коммит.

  4. Напишите функцию main:

    int main()
    {
        return 0;
    }
    

    Проверьте состояние файла main.c.

  5. Проиндексируйте файл main.c. Создайте еще один коммит. В заголовок коммита добавьте сообщение, отражающее внесённое изменение. Посмотрите историю изменений.

  6. По аналогии добавьте вывод сообщения «Hello, World». Приложение должно компилироваться с опцией -Wall без ошибок и предупреждений.

    $ gcc -Wall -o main main.c
    

    Проверьте вывод сообщения:

    $ ./main
    

Проиндексируйте файл main.c. Создайте еще один коммит. Посмотрите историю репозитория.

  1. В лабораторных работах и курсовом проекте требуется соблюдение code style. Для автоматического форматирования исходников можно использовать утилиту clang-format. Скачайте конфиг .clang-format в корень репозитория hw-<username>. Обратите внимание, что имя файла должно начинаться с точки. Для скачивания конфига воспользуйтесь командой:

    wget https://csc-software-development.readthedocs.io/ru/2023/_static/.clang-format
    

    Убедитесь, что конфиг находится в репозитории, выполнив команду:

    $ ls -a
    
  2. Теперь файл .clang-format можно закоммитить:

    $ git add .clang-format
    $ git commit -m "Import .clang-format config"
    

    Установите в систему clang-format. Настройте свой текстовый редактор так, чтобы форматирование исходников выполнялось при сохранении файла. Убедитесь, что автоматическое форматирование работает.

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

    $ gedit &
    

    И следуйте инструкции.

  3. Для настройки беспарольного взаимодействия с удаленным репозиторием, необходимо создать следующий конфиг:

    $ mkdir ~/.ssh
    
    $ vim ~/.ssh/config
    Host github.com
       Hostname ssh.github.com
       Port 443
    

    Для выхода из редактора vim используйте Esc + :wq

  4. Для загрузки локальных изменений без ввода логина и пароля учетной записи на GitHub cгенерируйте SSH-ключ, выполнив команду ssh-keygen в терминале:

    $ ssh-keygen
    

Пропустите предлагаемый ввод, нажимая клавишу Enter до тех пор, пока команда ssh-keygen не завершит работу.

_images/id_rsa_pub.png

Скопируйте содержимое файла /home/<username>/.ssh/id_rsa.pub

$ cat /home/<username>/.ssh/id_rsa.pub
  1. Создайте SSH-ключ в настройках учетной записи на GitHub:

    1. Settings → SSH and GPG keys → New SSH key

    2. В качестве Title введите Study

    3. В поле Key вставьте скопированный публичный ключ

    4. Add SSH key

  2. Скопируйте SSH-ссылку на созданный репозиторий ЛР0: hw

_images/get-ssh-url.png
  1. Выполните команду:

    $ git remote -v
    

Проанализируйте вывод. Далее выполните:

$ git remote set-url origin git@github.com:trpo2023/hw-<username>.git
$ git remote -v

Что изменилось?

  1. Загрузите изменения в удаленный репозиторий с помощью команды git push. Посмотрите историю изменений. Убедитесь, что локальная ветка main и удаленная origin/main указывают на один и тот же коммит.

  2. Передайте выполненное задание на ревью преподавателю практики. Для этого:

    1. Откройте в браузере страницу репозитория.

    2. На вкладке Pull requests перейдите в Feedback. Этот Pull request создан автоматически. Не закрывайте и не вливайте его. В лабораторных и курсовых он должен оставаться открытым.

    3. В поле Reviewers выберите своего преподавателя.

    _images/review-box.png
    1. Если ревью было пройдено со статусом Changes requested, исправьте замечения и запросите повторное ревью.

    _images/review-request.png

Полезные ссылки для настройки текстового редактора:

  1. Официальная документация ClangFormat содержит информацию по настройке vim и emacs.

  2. Vim: плагин rhysd/vim-clang-format (не проверялся)

  3. Visual Studio Code: Code Formatting — официальная документация.

  4. Atom — clang-format — плагин для редактора Atom. Может потребовать дополнительной настройки.

  5. SublimeClangFormat — плагин для Sublime Text.

  6. gedit-plugin-clang-format (не проверялся)

Настройка clang-format на ПК в аудиториях

В аудиториях вам доступны редакторы: vim, emacs, gedit. Из них наиболее низкий порог входа у gedit.

Gedit не поддерживает возможность автоматического форматирования файла при сохранении. Плагин из списка выше форматирует файл только при нажатии сочетания Alt+Shift+F или любого другого выбранного вами.

Если добиться работоспособности плагина не удалось, есть альтернативный способ подключения clang-format к gedit.

  1. Включить плагин «Внешние инструменты»: Меню → Параметры → Модули, отметить плагин «Внешние инструменты».

  2. Меню → Управление внешними инструментами → Add a new tool (+).

  3. Заполнить поля (см. скриншот):

_images/clang-format-gedit.png

Известная проблема: при форматировании документа редактор выполняет прокрутку к началу файла.

Контрольные вопросы

  1. Где хранятся настройки git?

  2. Как просмотреть состояния файлов в репозитории?

Заключение

Работа считается выполненной, если:

  1. У вас установлено и настроено необходимое ПО.

  2. Создан репозиторий hw-<username>, в котором находится исходный код программы. Приложение компилируется с опциями -Wall -Werror. Ветка main запушена в удаленный репозиторий.

  3. В репозитории есть конфиг .clang-format. В вашем текстовом редакторе настроено автоматическое форматирование исходного кода с использованием этого конфига. Исходный код приложения отформатирован.

  4. Работа выполнена в несколько коммитов, все действия по индексации файлов, созданию коммитов и загрузке в удаленный репозиторий выполнялись в командной строке.

  5. В репозитории нет лишних файлов (артефактов сборки, таких как исполняемые или объектные файлы, локальных настроек текстового редактора и т. д.).