02.14 Работа с git
- Правила работы с git, которые следует соблюдать при решении Д/З
- «Одно изменение — один коммит». Какие бывают изменения в Д/З?
- Дописал недописанное
- Исправил багу
- Добавил тест
- …
- «Дескриптивное описание»
- Если изменение атомарно — достаточно однострочника
Если в нескольких файлах или изменение неатомарно (например, добавил тест, словил ошибку, сделал коммит с ошибкой и тестом) — нужно и атомарное, и развёрнутое описание
- Также развёрнутое описание нужно, чтобы пояснить, что именно сделано
«Ответственная публикация» (TODO в этот раз не успели)
- «Одно изменение — один коммит». Какие бывают изменения в Д/З?
- Иллюстрации по структуре объектов git-репозитория:
- Первый коммит с простой структурой (файлы в одном каталоге):
- Первый коммит с файлами в нескольких каталогах:
- История из нескольких последовательных коммитов:
- Первый коммит с простой структурой (файлы в одном каталоге):
- Замечания по структуре объектов
Заголовок, в котором лежит строка вида «b"тип_объекта размер"», отделяется от содержимого нулевым байтом. Удобно пользоваться методом .partition(b'\x00')
Объект типа blob — это просто содержимое файла
Объект типа tree:
b"атрибуты имя"
b'\x00'
ID = bytes[20]
разделитель = b'\x00'
b"атрибуты имя"
b'\x00'
ID = bytes[20]
разделитель = b'\x00'
…
b"атрибуты имя"
b'\x00'
ID = bytes[20]
Объект типа commit — текстовый, строки до первой пустой — служебные, вида b"Поле содержание" (нам важно поле parent, если оно есть)
Полей "parent" в коммите может быть любое (?) число, точно бывает 0, 1 и 2 штуки
Коммит ID, соответствующие HEAD различных веток, лежат в файле .git/refs/heads/имя_ветки
Простой просмотр (вывод b''-сроки) произвольного объекта из .git/objects/??/*
понадобится zlib.decompress()
Простой просмотр всех объектов
понадобится glob.iglob()
Просмотр объекта типа commit
Просмотр объекта типа tree с выводом имён файлов и их commit ID
В результате должно получиться примерно это
Задача_1: напишите программу-просмотрщик git-репозитория, оформите её функциональность в виде нескольких коммитов.
- Коммиты должны соответствовать добавлению к программе следующих возможностей:
- Без параметров программа выводит имена всех веток; дальнейшие требования относятся к запуску программы с одним параметром — именем ветки.
- Вывести объект-последний коммит (последний коммит указанной ветки).
- Вывести объект-дерево, на который указывает последний коммит ветки (поддеревья обрабатывать не нужно).
- Вывести объект-дерево, на который указывает последний коммит ветки, в виде дерева
- Пройти по истории от последнего к начальному коммиту ветки, для каждого коммита вывести объект-деревою
- В случае нескольких родительских коммитов выбирать первый, топологией не заморачиваться.
- В случае нескольких родительских коммитов выбирать первый, топологией не заморачиваться.
- Коммиты должны соответствовать добавлению к программе следующих возможностей:
Д/З
Доделать задачу и опубликовать её по стандартным правилам
- При публикации следовать рекомендациям оформления commit message
- Тестов на этот раз не предусмотрено