Подтвердить что ты не робот

Git внутренний формат репозитория

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

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

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

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

4b9b3361

Ответ 1

Внутренний формат репозитория чрезвычайно прост. Git - это, по сути, файловая система пространства пользователя, содержимое которой адресуется.

Вот эскиз эскизов.

Объекты

Git сохраняет свои внутренние структуры данных как objects. Существует четыре типа объектов: blobs (вроде подобных файлов), деревья (вроде подобных каталогов), фиксирует (моментальные снимки файловой системы в определенные моменты времени вместе с информацией о том, как туда добраться) и теги (указатели на фиксации полезно для маркировки важных).

Если вы заглянете в каталог .git репозитория, вы найдете каталог objects, который содержит файлы, названные хэшем SHA-1. Каждый из них представляет собой объект. Вы можете проверить их с помощью команды сантехника git cat-file. Пример объекта commit из одного из моих репозиториев

[email protected]% git cat-file -p 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
tree c45d8922787a3f801c0253b1644ef6933d79fd4a
parent 4ee56fbe52912d3b21b3577b4a82849045e9ff3f
author Noufal Ibrahim <[email protected]> 1322165467 +0530
committer Noufal Ibrahim <[email protected]> 1322165467 +0530

Added a .md extension to README

Вы также можете увидеть сам объект в .git/objects/73/47addd901afc7d237a3e9c9512c9b0d05c6cf7.

Вы можете просмотреть другие объекты, подобные этому. Каждая фиксация указывает на дерево, представляющее файловую систему в этот момент времени, и имеет один (или более в случае слияния) родительский.

Объекты хранятся как отдельные файлы в каталоге objects. Они называются свободными объектами. Когда вы запускаете git gc, объекты, которые больше не могут быть достигнуты, обрезаются, а остальные упаковываются вместе в один файл и дельта сжаты. Это больше пространства и компактность репозитория. После запуска gc вы можете посмотреть каталог .git/objects/pack/, чтобы увидеть Git packfiles. Чтобы распаковать их, вы можете использовать команду git unpack-objects команды сантехники. Файл .git/objects/info/packs содержит список файлов packfiles, которые в настоящее время присутствуют.

Ссылки

Следующее, что вам нужно знать, это ссылки. Это указатели на определенные коммиты или объекты. Ваши ветки и другие подобные вещи реализованы в качестве ссылок. Есть два вида "реальных" (которые похожи на жесткие ссылки в файловой системе) и "символические" (которые являются указателями на реальные ссылки - как символические ссылки).

Они расположены в каталоге .git/refs. Например, в вышеупомянутом репозитории я нахожусь в ветке master. Моя последняя фиксация

[email protected]% git log -1
commit 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Author: Noufal Ibrahim <[email protected]>
Date:   Fri Nov 25 01:41:07 2011 +0530

    Added a .md extension to README

Вы можете видеть, что моя ссылка master, расположенная в .git/refs/heads/master, указывает на эту фиксацию.

[email protected]% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7

Текущая ветвь хранится в символической ссылке HEAD, расположенной в .git/HEAD. Здесь

[email protected]% more .git/HEAD
ref: refs/heads/master

Он изменится, если вы переключите ветки.

Аналогично, теги также являются подобными ссылками (но они не могут перемещаться в отличие от ветвей).

Весь репозиторий управляется с помощью только DAG коммитов (каждый из которых указывает на дерево, представляющее файлы в определенный момент времени) и ссылки, которые указывают на различные коммиты в DAG, чтобы вы могли ими управлять.

Дальнейшее чтение

  • У меня есть презентация, которую я использую для своих Git тренировок здесь, что объясняет некоторые из этих.
  • В общенациональной книге http://book.git-scm.com/ есть несколько разделов о внутренних компонентах.
  • В книге Scott Chacon Pro Git есть раздел о внутренних документах
  • У него также есть peepcode PDF только о внутренних компонентах.