Ответ 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 только о внутренних компонентах.