Проектная лаборатория
Собственный Git
Этап 02 · Основные этапы
Чтение blob-объекта
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите поддержку чтения blob-объекта командой git cat-file.
Объекты Git
В этом задании мы будем работать с тремя типами объектов Git:
- Blob (этот этап).
- Хранят данные файлов.
- Blob хранит только содержимое файла, без его имени и прав доступа.
- Деревья (следующие этапы).
- Хранят структуру каталогов.
- Могут содержать сведения о файлах и каталогах дерева, их именах и правах доступа.
- Коммиты (следующие этапы).
- Хранят данные коммитов.
- Могут содержать сообщение коммита, автора, создателя коммита, родительские коммиты и другие сведения.
Каждый объект Git определяется 40-символьным хешем SHA-1, также называемым «хешем объекта».
Пример хеша объекта: e88f7a929cd70b0274c4ea33b209c97fa845fdbc.
Хранение объектов Git
Объекты Git хранятся в каталоге .git/objects. Путь к объекту определяется его хешем.
Для объекта с хешем e88f7a929cd70b0274c4ea33b209c97fa845fdbc путь будет следующим:
.git/objects/e8/8f7a929cd70b0274c4ea33b209c97fa845fdbcКак видите, файл размещён не непосредственно в .git/objects, а в каталоге, названном первыми двумя символами хеша объекта. Оставшиеся 38 символов используются как имя файла.
У каждого типа объектов Git свой формат хранения. На этом этапе мы рассмотрим хранение blob-объектов, а другие типы изучим позже.
Хранение blob-объектов
Каждый blob-объект Git хранится отдельным файлом в каталоге .git/objects. Файл содержит заголовок и содержимое blob-объекта, сжатые с помощью Zlib.
Формат файла blob-объекта выглядит так (после распаковки Zlib):
blob <size>\0<content><size>— размер содержимого в байтах.\0— нулевой байт.<content>— само содержимое файла.
Например, если файл содержит hello world, файл blob-объекта будет выглядеть так (после распаковки Zlib):
blob 11\0hello worldКоманда cat-file
На этом этапе вы прочитаете blob-объект из репозитория Git, считывая его содержимое из каталога .git/objects.
Для этого мы воспользуемся первой из нескольких низкоуровневых команд («plumbing»), которые встретятся в задании: git cat-file.
Команда git cat-file позволяет посмотреть тип объекта, его размер и содержимое. Пример:
$ git cat-file -p <blob_sha>
hello world # This is the contents of the blobДля реализации нужно:
- Прочитать файл blob-объекта из каталога
.git/objects. - Распаковать содержимое с помощью Zlib.
- Извлечь собственно содержимое файла из распакованных данных.
- Записать его в stdout.
Тесты
Тестирующая система сначала инициализирует новый репозиторий Git вашей программой, затем поместит blob-объект со случайным содержимым в каталог .git/objects:
$ mkdir /tmp/test_dir && cd /tmp/test_dir
$ /path/to/your_program.sh init
$ echo "hello world" > test.txt # The tester will use a random string, not "hello world"
$ git hash-object -w test.txt
3b18e512dba79e4c8300dd08aeb37f8e728b8dadПосле этого она запустит программу следующим образом:
$ /path/to/your_program.sh cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello worldТестирующая система проверит, что вывод программы совпадает с содержимым blob-объекта.
Примечания
- Во многих языках стандартная функция печати (например,
fmt.Println) добавляет перевод строки в конце вывода. Выводcat-fileне должен содержать дополнительного перевода строки в конце, поэтому может потребоваться другая функция печати. - Помните, что Git сжимает объекты с помощью Zlib. Для чтения таких файлов можно использовать встроенный пакет Go compress/zlib.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init git ./my-git --language go2. Откройте папку в IDE
cd ./my-gitРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ic4Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.