git cat-file - основной инструмент для просмотра содержимого
Git-объектов «изнутри». Используется в скриптах, при отладке и
при изучении того, как Git хранит данные.
Базовые флаги
git cat-file -t <sha> # тип: blob | tree | commit | tag
git cat-file -s <sha> # размер содержимого в байтах
git cat-file -p <sha> # содержимое (pretty-print)
git cat-file -e <sha> # проверка существования, через exit code
Pretty-print подбирает форматирование под тип объекта:
- blob → сырые байты как есть.
- tree → таблица «mode type sha name».
- commit → текстовое представление: tree, parent, author, committer, message.
- tag → annotated tag со всеми полями.
Примеры
Какой объект под этим SHA?
git cat-file -t 8d0e41
# blob
Показать содержимое последнего коммита:
git cat-file -p HEAD
# tree 7e3f9a2b1c4d5e6f...
# parent a1b2c3d4...
# author ...
# committer ...
#
# Сообщение коммита
Заглянуть в корневое дерево этого коммита:
git cat-file -p HEAD^{tree}# 100644 blob 5f7e9c12... README.md
# 100644 blob 8a3f2e91... index.html
Проверить, есть ли объект, без вывода:
if git cat-file -e <sha> 2>/dev/null; then
echo "объект на месте"
fi
Batch-режим
Для скриптов, которые читают много объектов:
echo HEAD | git cat-file --batch
# <sha> commit 245
# tree ...
# parent ...
# ...
--batch принимает SHA на stdin построчно и выдаёт метаинформацию
- содержимое для каждого. На больших репозиториях это в десятки
раз быстрее, чем запускать
cat-file -pдля каждого SHA отдельно.
Подводные камни
- Pretty-print для blob выводит сырые байты как есть. Если blob -
бинарный (картинка, архив), это сломает терминал. Сначала
проверь тип через
-t. - Объект может быть в packfile, и
cat-fileнайдёт его всё равно - это plumbing-уровень, packfile прозрачен.
-p HEADпоказывает commit-объект, не tree. Чтобы увидеть содержимое -HEAD^{tree}илиgit ls-tree HEAD.