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

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

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

Этап 06 · Основные этапы

Создание коммита

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы реализуете команду git commit-tree, создающую объект коммита.

Коммиты

Последний тип объектов Git, с которым мы будем работать в этом задании, — объект коммита.

Файл объекта коммита выглядит так (до сжатия Zlib):

commit <size>\0tree <tree_sha>
parent <parent_sha>
author <name> <<email>> <timestamp> <timezone>
committer <name> <<email>> <timestamp> <timezone>
 
<commit message>
  • Файл начинается с commit <size>\0 (тот же шаблон заголовка, что у blob-объектов и деревьев).
  • После заголовка идёт обычный текст, а не двоичные данные.
  • Каждая строка заканчивается символом перевода строки (\n).
  • Хеши SHA дерева и родителя записаны в шестнадцатеричном формате (40 символов), в отличие от объектов-деревьев, где они занимают 20 байт.
  • Между метаданными и сообщением коммита находится пустая строка.
  • Формат времени: <seconds_since_epoch> <timezone_offset> (например, 1234567890 +0000).

Пример объекта коммита:

commit 177\0tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
parent 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
author John Doe <john@example.com> 1234567890 +0000
committer John Doe <john@example.com> 1234567890 +0000
 
Initial commit

Подробнее о формате объекта коммита можно прочитать здесь.

Команда git commit-tree

Команда git commit-tree создаёт объект коммита.

Например:

$ mkdir test_dir && cd test_dir
$ git init
Initialized empty Git repository in /path/to/test_dir/.git/
 
# Create a tree, get its SHA
$ echo "hello world" > test.txt
$ git add test.txt
$ git write-tree
4b825dc642cb6eb9a060e54bf8d69288fbee4904
 
# Create the initial commit
$ git commit-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 -m "Initial commit"
3b18e512dba79e4c8300dd08aeb37f8e728b8dad
 
# Write some changes, get another tree SHA
$ echo "hello world 2" > test.txt
$ git add test.txt
$ git write-tree
5b825dc642cb6eb9a060e54bf8d69288fbee4904
 
# Create a new commit with the new tree SHA and parent
$ git commit-tree 5b825dc642cb6eb9a060e54bf8d69288fbee4904 -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad -m "Second commit"
6c18e512dba79e4c8300dd08aeb37f8e728b8dad

Команда git commit-tree выводит 40-символьный хеш SHA-1 объекта коммита, записанного в .git/objects.

Тесты

Ваша программа будет запущена следующим образом:

$ ./your_program.sh commit-tree <tree_sha> -p <commit_sha> -m <message>

Программа должна создать объект коммита и вывести его 40-символьный хеш SHA-1 в stdout.

Для упрощения:

  • Вы получите ровно один родительский коммит.
  • Сообщение будет состоять ровно из одной строки.
  • Можно жёстко задать любое допустимое имя и адрес электронной почты для полей автора и создателя коммита.
  • Можно использовать любую допустимую временную метку, например текущее время или фиксированное значение.

Тестирующая система проверит результат, прочитав объект коммита из каталога .git командой git show.

Примечания

  • Для простых коммитов строки автора и создателя коммита обычно совпадают. Можно жёстко задать значения вроде John Doe <john@example.com> 1234567890 +0000.

Проверка в вашей 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 jm9

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

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

go / ЛОКАЛЬНО

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

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

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

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