Blob (binary large object) - самый простой из четырёх типов объектов Git. Содержит только содержимое файла, как последовательность байтов. Не знает ни как файл называется, ни где лежит.
Имя файла, права доступа, путь - всё это хранится в tree-объекте, который ссылается на blob по SHA.
Создание
Через высокоуровневое API - автоматически при git add. Через
плумбинг:
echo "содержимое" | git hash-object --stdin -w
# 8d0e41234f24b6da002d962a26c2495ea16a425f
Флаг -w сохраняет blob в .git/objects/. Без флага - просто
возвращает SHA, не пишет.
SHA-1 хэш
Хэш считается не от чистого содержимого, а от строки:
blob <длина-в-байтах>\0<содержимое>
Префикс blob и длина - часть данных для хэширования. Поэтому пустой
файл и файл с одной пустой строкой имеют разный SHA - длина разная.
Дедупликация
Если два файла в репозитории идентичны побайтово - у них одинаковый
SHA, и Git хранит один blob. На уровне tree они выглядят как две
разные записи (с разными именами), но обе указывают на один объект в
.git/objects/.
Это даёт бесплатную дедупликацию по содержимому: одинаковые файлы не занимают место дважды, даже между разными коммитами.