02.13 Работа с git
- Правила работы с git, которые следует соблюдать при решении Д/З
- «Одно изменение — один коммит».
- Какие бывают изменения в Д/З?
- Дописал недописанное
- Исправил багу
- Добавил тест
- …
- Какие бывают изменения в Д/З?
- «Дескриптивное описание»
- Если изменение атомарно — достаточно однострочника
Если в нескольких файлах или изменение неатомарно (например, добавил тест, словил ошибку, сделал коммит с ошибкой и тестом) — нужно и атомарное, и развёрнутое описание
- Также развёрнутое описание нужно, чтобы пояснить, что именно сделано
«Ответственная публикация» (TODO в этот раз не успели)
- «Одно изменение — один коммит».
- Иллюстрации по структуре объектов git-репозитория:
- Первый коммит с простой структурой (файлы в одном каталоге):
- Первый коммит с файлами в нескольких каталогах:
- История из нескольких последовательных коммитов:
- Первый коммит с простой структурой (файлы в одном каталоге):
- Замечания по структуре объектов
Заголовок, в котором лежит строка вида «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/имя_ветки
Простой просмотр (вывод b''-сроки) произвольного объекта из .git/objects/??/*
понадобится zlib.decompress()
Простой просмотр всех объектов
понадобится glob.iglob()
Просмотр объекта типа commit
Просмотр объекта типа tree с выводом имён файлов и их commit ID
В результате должно получиться примерно это
Задача_1: напишите программу-просмотрщик git-репозитория, оформите её функциональность в виде нескольких коммитов.
Коммиты должны соответствовать добавлению к программе следующих возможностей: (примеры показывать формат вывода)
- Без параметров программа выводит имена всех веток; дальнейшие требования относятся к запуску программы с одним параметром — именем ветки.
master lomaster
- Вывести объект-последний коммит (последний коммит указанной ветки).
tree 3182cbd0e8b2baecbdc693008ed832b25546e225 parent f97190bd4dea21041d1cd7fcf822cd4ac6e7716b author Ivan Samovarov <isamovarov@mail.ru> committer Elec Tropoezd <elec@tropoe.zd> Added a very important feature.
- Вывести объект-дерево, на который указывает последний коммит ветки (поддеревья обрабатывать не нужно).
blob cf1ab25da0349f84a3fdd40032f0ce99db813b8b LICENSE blob f99151731324e7ac98281272c68f2b599dbf868d Makefile tree b6e86ab64d77628cff4cfcaaf9133533733f8553 Tests
- Пройти по истории от последнего к начальному коммиту ветки, для каждого коммита вывести объект-дерево
- В случае нескольких родительских коммитов выбирать первый, топологией не заморачиваться.
- "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
- Без параметров программа выводит имена всех веток; дальнейшие требования относятся к запуску программы с одним параметром — именем ветки.
Д/З
Доделать задачу и опубликовать её по стандартным правилам
- При публикации следовать рекомендациям оформления commit message