Проектная лаборатория

Собственный Git

0 / 7этапов пройдено

Этап 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 go

2. Откройте папку в IDE

cd ./my-git

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ic4

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста