02.13 Работа с git

  1. Правила работы с git, которые следует соблюдать при решении Д/З
    1. «Одно изменение — один коммит».
      • Какие бывают изменения в Д/З?
        • Дописал недописанное
        • Исправил багу
        • Добавил тест
    2. «Дескриптивное описание»
      • Если изменение атомарно — достаточно однострочника
      • Если в нескольких файлах или изменение неатомарно (например, добавил тест, словил ошибку, сделал коммит с ошибкой и тестом) — нужно и атомарное, и развёрнутое описание

      • Также развёрнутое описание нужно, чтобы пояснить, что именно сделано
    3. «Ответственная публикация» (TODO в этот раз не успели)

  2. Иллюстрации по структуре объектов git-репозитория:
    • Первый коммит с простой структурой (файлы в одном каталоге):

      LecturesCMC/PythonDevelopment2022/Prac/01_Intro/simple_commit.png

    • Первый коммит с файлами в нескольких каталогах:

      LecturesCMC/PythonDevelopment2022/Prac/01_Intro/complex_commit.png

    • История из нескольких последовательных коммитов:

      LecturesCMC/PythonDevelopment2022/Prac/01_Intro/history.png

  3. Замечания по структуре объектов
    • Заголовок, в котором лежит строка вида «b"тип_объекта размер"», отделяется от содержимого нулевым байтом. Удобно пользоваться методом .partition(b'\x00')

    • Объект типа blob — это просто содержимое файла

    • Объект типа tree:

      • b'tree размер'

        b'\x00'

        b'атрибуты имя'

        b'\x00'

        ID = bytes[20]

        b'атрибуты имя'

        b'\x00'

        ID = bytes[20]

        b"атрибуты имя"

        b'\x00'

        ID = bytes[20]

    • Объект типа commit — текстовый, строки до первой пустой — служебные, вида b"Поле содержание" (нам важно поле parent, если оно есть)

      • Полей "parent" в коммите может быть любое (?) число, точно бывает 0, 1 и 2 штуки

    • Коммит ID, соответствующие HEAD различных веток, лежат в файле .git/refs/heads/имя_ветки

  4. {i} Простой просмотр (вывод b''-сроки) произвольного объекта из .git/objects/??/*

    • понадобится zlib.decompress()

  5. {i} Простой просмотр всех объектов

    • понадобится glob.iglob()

  6. {i} Просмотр объекта типа commit

  7. {i} Просмотр объекта типа tree с выводом имён файлов и их commit ID

  8. В результате должно получиться примерно это

  9. <!> Задача_1: напишите программу-просмотрщик git-репозитория, оформите её функциональность в виде нескольких коммитов.

    • Коммиты должны соответствовать добавлению к программе следующих возможностей: (примеры показывать формат вывода)

      1. Без параметров программа выводит имена всех веток; дальнейшие требования относятся к запуску программы с одним параметром — именем ветки.
        • master
          lomaster
      2. Вывести объект-последний коммит (последний коммит указанной ветки).
        • tree 3182cbd0e8b2baecbdc693008ed832b25546e225
          parent f97190bd4dea21041d1cd7fcf822cd4ac6e7716b
          author Ivan Samovarov <isamovarov@mail.ru>
          committer Elec Tropoezd <elec@tropoe.zd>
          
          Added a very important feature.
      3. Вывести объект-дерево, на который указывает последний коммит ветки (поддеревья обрабатывать не нужно).
        • blob cf1ab25da0349f84a3fdd40032f0ce99db813b8b    LICENSE
          blob f99151731324e7ac98281272c68f2b599dbf868d    Makefile
          tree b6e86ab64d77628cff4cfcaaf9133533733f8553    Tests
      4. Пройти по истории от последнего к начальному коммиту ветки, для каждого коммита вывести объект-дерево
        • В случае нескольких родительских коммитов выбирать первый, топологией не заморачиваться.
        • "TREE" большими буквами выделяет строку, где сказано, дерево для какого коммита выводится.
          TREE for commit f5980e79c7f010f38d249390248936dd0ae58a3a
          blob cf1ab25da0349f84a3fdd40032f0ce99db813b8b    LICENSE
          blob f99151731324e7ac98281272c68f2b599dbf868d    Makefile
          tree b6e86ab64d77628cff4cfcaaf9133533733f8553    Tests
          TREE for commit f97190bd4dea21041d1cd7fcf822cd4ac6e7716b
          blob cf1ab25da0349f84a3fdd40032f0ce99db813b8b    LICENSE
          blob 2cb7f6e3ff1a5d1ab379d953dbc7b5738d1dfed3    Makefile
          tree b6e86ab64d77628cff4cfcaaf9133533733f8553    Tests

Д/З

LecturesCMC/PythonDevelopment2023/Prac/01_Intro (последним исправлял пользователь FrBrGeorge 2023-02-19 21:23:38)