Внутренний формат хранилища предельно прост.Git - это, по сути, файловая система пространства пользователя, которая адресуется содержимому
Вот эскиз эскиза.
Объекты
Git хранит свои внутренние структуры данных как объекты .Существует четыре вида объектов: BLOB-объекты (вроде файлов), деревья (вроде каталогов), коммиты (моментальные снимки файловой системы в определенные моменты времени и информация о том, как туда добраться) и теги (указатели на коммиты).полезно для пометки важных).
Если вы загляните в каталог .git
хранилища, вы найдете каталог objects
, который содержит файлы, названные хешем SHA-1.Каждый из них представляет собой объект.Вы можете проверить их, используя команду git cat-file
.Пример фиксации объекта из одного из моих репозиториев
noufal@sanitarium% git cat-file -p 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
tree c45d8922787a3f801c0253b1644ef6933d79fd4a
parent 4ee56fbe52912d3b21b3577b4a82849045e9ff3f
author Noufal Ibrahim <noufal@..> 1322165467 +0530
committer Noufal Ibrahim <noufal@..> 1322165467 +0530
Added a .md extension to README
Сам объект также можно увидеть по адресу .git/objects/73/47addd901afc7d237a3e9c9512c9b0d05c6cf7
.
Вы можете исследовать другие объекты, как этот.Каждый коммит указывает на дерево, представляющее файловую систему в тот момент времени, и имеет одного (или более в случае коммитов слияния) родителя.
Объекты хранятся в виде отдельных файлов в каталоге objects
.Это так называемые свободные объекты.Когда вы запускаете git gc
, объекты, которые больше не могут быть достигнуты, удаляются, а остальные упаковываются в один файл и сжимаются дельтой.Это более экономно и компактно.После запуска gc вы можете посмотреть каталог .git/objects/pack/
, чтобы увидеть файлы git pack.Чтобы распаковать их, вы можете использовать команду git unpack-objects
.Файл .git/objects/info/packs
содержит список упаковочных файлов, которые в настоящее время присутствуют.
Ссылки
Следующее, что вам нужно знать, это ссылки.Это указатели на определенные коммиты или объекты.Ваши ветки и другие подобные вещи реализованы в виде ссылок.Существует два вида «реальные» (которые похожи на жесткие ссылки в файловой системе) и «символические» (которые являются указателями на реальные ссылки - например, на символические ссылки).
Они расположены в каталоге .git/refs
.Например, в приведенном выше хранилище я на ветке master
.Мой последний коммит
noufal@sanitarium% git log -1
commit 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Author: Noufal Ibrahim <noufal@...>
Date: Fri Nov 25 01:41:07 2011 +0530
Added a .md extension to README
Вы видите, что моя ссылка master
, расположенная в .git/refs/heads/master
, указывает на этот коммит.
noufal@sanitarium% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Текущая ветвь сохраняется в символьной ссылке HEAD
, расположенной в .git/HEAD
.Здесь это
noufal@sanitarium% more .git/HEAD
ref: refs/heads/master
Это изменится, если вы переключите ветви.
Аналогично, теги тоже являются ссылками, подобными этой (но они не являются подвижными в отличие от ветвей).
Весь репозиторий управляется с помощью просто DAG коммитов (каждый из которых указывает на дерево, представляющее файлы в определенный момент времени) и ссылки, которые указывают на различные коммиты в DAG, чтобы вы могли ими манипулировать.
Дальнейшее чтение
- У меня есть презентация, которую я использую для моих тренировок по мерзавке, здесь , которая объясняет некоторые из них.
- В общей книге http://book.git -scm.com / есть несколько разделов, посвященных внутренним компонентам.
- В книге Pro Git Скотта Чакона есть раздел, посвященный внутренним элементам
- У него также есть peepcode PDF только о внутренних элементах.