Tree - объект, который описывает содержимое одной директории. Каждая строка tree - это одна запись:
100644 blob 5f7e9c12... README.md
100644 blob 8a3f2e91... index.html
040000 tree e2b5a91f... images
100644 blob b1d4a7e0... style.css
Четыре колонки:
- Права доступа -
100644обычный файл,100755исполняемый,040000поддиректория,120000симлинк,160000gitlink (submodule). Git хранит mode как число,git ls-treeвсегда печатает шестью цифрами с ведущим нулём. - Тип -
blobдля файла,treeдля поддиректории. - SHA - указатель на сам blob или tree.
- Имя - как файл/папка называется в этой директории.
Содержимое файла лежит в blob. Tree связывает имя с этим содержимым.
Рекурсивная структура
Tree, в котором есть запись типа tree, указывает на другой
tree-объект для поддиректории. Получается дерево из tree-объектов,
отражающее дерево директорий проекта:
корневой tree
├── blob README.md
├── tree images/
│ ├── blob logo.png
│ └── blob banner.jpg
└── blob style.css
Когда создаётся
При git commit. До коммита tree не существует - есть только
.git/index, который хранит плоский список путей. git write-tree
превращает индекс в иерархию tree-объектов и возвращает SHA корневого.
Посмотреть содержимое
git cat-file -p <tree-sha>
git ls-tree HEAD # tree последнего коммита
git ls-tree -r HEAD # рекурсивно, плоский список всех файлов
Дедупликация на уровне дерева
Если поддиректория не изменилась между двумя коммитами - tree этой поддиректории идентичен. Tree родителя ссылается на тот же SHA. То есть Git дедуплицирует не только файлы, но и целые поддиректории.