Git внутри: Работа непосредственно с объектами Git (бонус)

Цели

  • Исследовать структуру базы данных объектов.
  • Научиться использовать SHA1 хеши для поиска содержимого в репозитории.

Давайте исследуем объекты Git с помощью некоторых инструментов.

01 Поиск последнего коммита

Выполните

git log --max-count=1

Эта команда должна показать последний коммит в репозиторий. SHA1 хеш в вашей системе, вероятно, отличается от моего, но вы увидите что-то наподобие этого.

Результат

$ git log --max-count=1
* 8029c07 2011-03-09 | Added index.html. (HEAD, main) [Alexander Shvets]

02 Вывод последнего коммита

С помощью SHA1 хеша из коммита, указанного выше...

Выполните

git cat-file -t <hash>
git cat-file -p <hash>

Вот что выходит у меня...

Результат

$ git cat-file -t 8029c07
commit
$ git cat-file -p 8029c07
tree 096b74c56bfc6b40e754fc0725b8c70b2038b91e
parent 567948ac55daa723807c0c16e34c76797efbcbed
author Alexander Shvets <alex@githowto.com> 1299684476 -0500
committer Alexander Shvets <alex@githowto.com> 1299684476 -0500

Added index.html.

Это вывод объекта коммита, который находится во главе ветки main.

03 Поиск дерева

Мы можем вывести дерево каталогов, ссылка на который идет в коммите. Это должно быть описание файлов (верхнего уровня) в нашем проекте (для конкретного коммита). Используйте SHA1 хеш из строки «дерева», из списка выше.

Выполните

git cat-file -p <treehash>

Вот как выглядит мое дерево...

Результат

$ git cat-file -p 096b74c
100644 blob 28e0e9d6ea7e25f35ec64a43f569b550e8386f90	index.html
040000 tree e46f374f5b36c6f02fb3e9e922b79044f754d795	lib

Да, я вижу index.html и каталог lib.

04 Вывод каталога lib

Выполните

git cat-file -p <libhash>

Результат

$ git cat-file -p e46f374
100644 blob c45f26b6fdc7db6ba779fc4c385d9d24fc12cf72	hello.html

Существует файл hello.html.

05 Вывод файла hello.html

Выполните

git cat-file -p <hellohash>

Результат

$ git cat-file -p c45f26b
<!-- Author: Alexander Shvets (alex@githowto.com) -->
<html>
  <head>
  </head>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>

А вот и он. Мы вывели объекты коммитов, объекты деревьев и объекты блобов непосредственно из репозитория Git. Это все, что есть — блобы, деревья и коммиты.

06 Исследуйте самостоятельно

Исследуйте Git-репозиторий вручную самостоятельно. Смотрите, удастся ли вам найти оригинальный файл hello.html с самого первого коммита вручную по ссылкам SHA1 хеша в последнем коммите.