Git репозиторий внутренний формат объяснил - PullRequest
13 голосов
/ 25 ноября 2011

Есть ли документация о том, как Git хранит файлы в своем хранилище?Я пытаюсь искать через Интернет, но без результатов.Может быть, я использую неправильный запрос или, может быть, это великий секрет - внутренний формат Git-репозитория?

Позвольте мне объяснить, зачем мне нужна эта информация о ракетостроении: я использую C # для получения репозитория форм истории файлов.Но в библиотеке libgit2sharp она пока не реализована.Поэтому (как ответственный человек;) мне нужно самостоятельно реализовать эту функцию и внести свой вклад в сообщество.

Но после перемещения исходников ядра в github я даже не знаю, с чего начать поиск.

Заранее большое спасибо!

1 Ответ

40 голосов
/ 25 ноября 2011

Внутренний формат хранилища предельно прост.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 только о внутренних элементах.
...