Практический сценарий использования git

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

1 Используемые стандарты и программные продукты

2 Установка программного обеспечения

2.1 Установка Node.js

  • На Node.js базируется программное обеспечение для семантического версионирования и общепринятых коммитов.
  • Для управления пакетами лучше использовать pnpm, но можно и yarn.
  • Gentoo
  • Ubuntu
    1apt-get install nodejs
    2apt-get install yarn
    
  • Fedora
    1dnf install nodejs
    2apt-get install pnpm
    
  • Windows
  • MacOS
    1brew install node
    

2.2 Настройка Node.js

Для работы с Node.js добавим каталог с исполняемыми файлами, устанавливаемыми пакетным менеджером, в переменную PATH.

  • Linux
    • pnpm
      • Запустите:
        1pnpm setup
        
      • Перелогиньтесь, или выполните:
        1source ~/.bashrc
        
    • yarn
      • В файле ~/.bashrc добавьте к переменной PATH:
        1PATH=~/.yarn/bin:$PATH
        

2.3 Установка git-flow

  • Linux

    • Gentoo
      1emerge dev-vcs/git-flow
      
    • Ubuntu
      1apt-get install git-flow
      
    • Centos
      • Первоначально нужно установить репозиторий epel (https://fedoraproject.org/wiki/EPEL):
        1yum install epel-release
        
      • Затем, собственно, установить git-flow:
        1yum install gitflow
        
    • Fedora
      • Это программное обеспечение удалено из репозитория.
      • Необходимо устанавливать его вручную:
        1cd /tmp
        2wget --no-check-certificate -q https://raw.github.com/petervanderdoes/gitflow/develop/contrib/gitflow-installer.sh
        3chmod +x gitflow-installer.sh
        4sudo ./gitflow-installer.sh install stable
        
  • Windows Git-flow входит в состав пакета git.

    1choco install git
    
  • MacOS

    1brew install git-flow
    

2.4 Общепринятые коммиты

2.4.1 commitizen

  • Данная программа используется для помощи в форматировании коммитов.
    • pnpm:
      1pnpm add -g commitizen
      
    • yarn:
      1yarn global add commitizen
      
  • При этом устанавливается скрипт git-cz, который мы и будем использовать для коммитов.

2.4.2 standard-version

  • Данная программа автоматизирует изменение номера версии.
    • pnpm:
      1pnpm add -g standard-version
      
    • yarn:
      1yarn global add standard-version
      

3 Настройка git

3.1 Первичная настройка параметров git

  • Зададим имя и email владельца репозитория:
    1git config --global user.name "Name Surname"
    2git config --global user.email "work@mail"
    
  • Настроим utf-8 в выводе сообщений git:
    1git config --global core.quotepath false
    
  • Настройте верификацию и подписание коммитов git (см. Верификация коммитов git с помощью GPG).
  • Зададим имя начальной ветки (будем называть её master):
    1git config --global init.defaultBranch master
    

3.2 Дополнительные настройки

3.2.1 Работа с переносами строк

  • В разных операционных системах приняты разные символы для перевода строк:
    • Windows: \r\n (CR и LF);
    • Unix: \n (LF);
    • Mac: \r (CR).
  • Посмотреть значения переносов строк в репозитории можно командой:
    1git ls-files --eol
    
  1. Параметр autocrlf

    • Настройка core.autocrlf предназначена для того, чтобы в главном репозитории все переводы строк текстовых файлах были одинаковы.

    • Настройка core.autocrlf с параметрами true и input делает все переводы строк текстовых файлов в главном репозитории одинаковыми.

      • core.autocrlf true: конвертация CRLF->LF при коммите и обратно LF->CRLF при выгрузке кода из репозитория на файловую систему (обычно используется в Windows).
      • core.autocrlf input: конвертация CRLF->LF только при коммитах (используются в MacOS/Linux).
    • Варианты конвертации

      Таблица 1: Варианты конвертации для разных значений параметра core.autocrlf
      core.autocrlffalseinputtrue
      git commitLF -> LFLF -> LFLF -> CRLF
      CR -> CRCR -> CRCR -> CR
      CRLF -> CRLFCRLF -> LFCRLF -> CRLF
      git checkoutLF -> LFLF -> LFLF -> CRLF
      CR -> CRCR -> CRCR -> CR
      CRLF -> CRLFCRLF -> CRLFCRLF -> CRLF
    • Установка параметра:

      • Для Windows
        1git config --global core.autocrlf true
        
      • Для Linux
        1git config --global core.autocrlf input
        
  1. Параметр safecrlf

    • Настройка core.safecrlf предназначена для проверки, является ли окончаний строк обратимым для текущей настройки core.autocrlf.
      • core.safecrlf true: запрещается необратимое преобразование lf<->crlf. Полезно, когда существуют бинарные файлы, похожие на текстовые файлы.
      • core.safecrlf warn: печать предупреждения, но коммиты с необратимым переходом принимаются.
    • Установка параметра:
      1git config --global core.safecrlf warn
      

4 Практический сценарий использования git

4.1 Создание репозитория git

4.1.1 Подготовка каталога

  • Рабочий каталог будем обозначать как workdir. Вначале нужно перейти в этот каталог:
    1cd workdir
    
  • Создаём заготовку для файла README.md:
    1echo "# test-repo" >> README.md
    2git add README.md
    
  • Добавим шаблон игнорируемых файлов. Просмотрим список имеющихся шаблонов:
    1curl -L -s https://www.gitignore.io/api/list
    
    Затем скачаем шаблон, например, для C и C++:
    1curl -L -s https://www.gitignore.io/api/c >> .gitignore
    2curl -L -s https://www.gitignore.io/api/c++ >> .gitignore
    
    Можно это же сделать через web-интерфейс на сайте https://www.gitignore.io/.
  • Добавим файл лицензии. В данном случае мы выбираем лицензию CC-BY-4.0 (см. Выбор лицензии для научной работы):
    1wget https://creativecommons.org/licenses/by/4.0/legalcode.txt -O LICENSE
    
  • Если выбирается лицензия CC-BY-SA-4.0, то нужно выполнить:
    1wget https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt -O LICENSE
    
  • Инициализируем системы git:
    1git init
    

4.1.2 Подключение репозитория к github

  • Создайте репозиторий на GitHub. Для примера назовём его test-repo.

  • Делаем первый коммит и выкладываем на github:

    1git commit -m "first commit"
    2git remote add origin git@github.com:<username>/test-repo.git
    3git push -u origin master
    

4.1.3 Конфигурация общепринятых коммитов

  • Конфигурация для пакетов Node.js

    1yarn init
    

    Необходимо заполнить несколько параметров пакета.

    • Название пакета.
    • Лицензия пакета. Список лицензий для npm: https://spdx.org/licenses/. Предлагается выбирать лицензию CC-BY-4.0.
  • Сконфигурим формат коммитов. Для этого добавим в файл package.json команду для формирования коммитов:

    1"config": {
    2        "commitizen": {
    3            "path": "cz-conventional-changelog"
    4        }
    5}
    

    Таким образом, файл package.json приобретает вид:

     1{
     2        "name": "test-repo",
     3        "version": "1.0.0",
     4        "description": "Git repo for educational purposes",
     5        "main": "index.js",
     6        "repository": "git@github.com:username/test-repo.git",
     7        "author": "Name Surname <username@gmail.com>",
     8        "license": "CC-BY-4.0",
     9        "config": {
    10            "commitizen": {
    11                "path": "cz-conventional-changelog"
    12            }
    13        }
    14}
    
  • Добавим новые файлы:

    1git add .
    
  • Выполним коммит:

    1git cz
    
  • Отправим на github:

    1git push
    

4.1.4 Конфигурация git-flow

  • Инициализируем git-flow
    1git flow init
    
    Префикс для ярлыков установим в v.
  • Проверьте, что Вы на ветке develop:
    1git branch
    
  • Загрузите весь репозиторий в хранилище:
    1git push -u --all
    
  • Создадим релиз с версией 1.0.0
    1git flow release start 1.0.0
    
  • Создадим журнал изменений
    1standard-changelog --first-release
    
  • Добавим журнал изменений в индекс
    1git add CHANGELOG.md
    2git commit -am 'chore(site): add changelog'
    
  • Зальём релизную ветку в основную ветку
    1git flow release finish 1.0.0
    
  • Отправим данные на github
    1git push --all
    2git push --tags
    
  • Создадим релиз на github. Для этого будем использовать утилиты работы с github (см. github: утилиты командной строки):
    1gh release create v1.0.0 -F CHANGELOG.md
    

4.2 Работа с репозиторием git

4.2.1 Разработка новой функциональности

  • Создадим ветку для новой функциональности:
    1git flow feature start feature_branch
    
  • Далее, продолжаем работу c git как обычно.
  • По окончании разработки новой функциональности следующим шагом следует объединить ветку feature_branch c develop:
    1git flow feature finish feature_branch
    

4.2.2 Создание релиза git-flow

  • Создадим релиз с версией 1.2.3:
    1git flow release start 1.2.3
    
  • Обновите номер версии в файле package.json. Установите её в 1.2.3.
  • Создадим журнал изменений
    1standard-changelog
    
  • Добавим журнал изменений в индекс
    1git add CHANGELOG.md
    2git commit -am 'chore(site): update changelog'
    
  • Зальём релизную ветку в основную ветку
    1git flow release finish 1.2.3
    
  • Отправим данные на github
    1git push --all
    2git push --tags
    
  • Создадим релиз на github с комментарием из журнала изменений:
    1gh release create v1.2.3 -F CHANGELOG.md
    

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие