Git внутри: Каталог .git (бонус)
Цели
- Узнать о структуре каталога
.git
.
01 Каталог .git
Настало время провести небольшое исследование. Для начала, из корневого каталога вашего проекта...
Выполните
ls -C .git
Результат
$ ls -C .git
COMMIT_EDITMSG MERGE_RR config hooks info objects rr-cache
HEAD ORIG_HEAD description index logs refs
Это магический каталог, в котором хранятся все «материалы» Git. Давайте заглянем в директорию объектов.
02 База данных объектов
Выполните
ls -C .git/objects
Результат
$ ls -C .git/objects
09 24 28 45 59 6a 77 80 8c 97 af c4 e7 info
11 27 43 56 69 6b 78 84 91 9c b5 e4 fa pack
Вы должны увидеть кучу каталогов, имена которых состоят из 2 символов. Имена каталогов являются первыми двумя буквами хеша sha1 объекта, хранящегося в Git.
03 Углубляемся в базу данных объектов
Выполните
ls -C .git/objects/<dir>
Результат
$ ls -C .git/objects/09
6b74c56bfc6b40e754fc0725b8c70b2038b91e 9fb6f9d3a104feb32fcac22354c4d0e8a182c1
Смотрим в один из каталогов с именем из 2 букв. Вы увидите файлы с именами из 38 символов. Это файлы, содержащие объекты, хранящиеся в Git. Они сжаты и закодированы, поэтому просмотр их содержимого нам мало чем поможет. Рассмотрим далее каталог .git
внимательно
04 Config File
Выполните
cat .git/config
Результат
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[user]
name = Alexander Shvets
email = alex@githowto.com
Это файл конфигурации, создающийся для каждого конкретного проекта. Записи в этом файле будут перезаписывать записи в файле .gitconfig
вашего главного каталога, по крайней мере в рамках этого проекта.
05 Ветки и теги
Выполните
ls .git/refs
ls .git/refs/heads
ls .git/refs/tags
cat .git/refs/tags/v1
Результат
$ ls .git/refs
heads
tags
$ ls .git/refs/heads
main
$ ls .git/refs/tags
v1
v1-beta
$ cat .git/refs/tags/v1
fa3c1411aa09441695a9e645d4371e8d749da1dc
Вы должны узнавать файлы в подкаталоге тегов. Каждый файл соответствует тегу, ранее созданному с помощью команды git tag
. Его содержание – это всего лишь хеш коммита, привязанный к тегу.
Каталог heads практически аналогичен, но используется для веток, а не тегов. На данный момент у нас есть только одна ветка, так что все, что вы увидите в этом каталоге – это ветка main
.
06 Файл HEAD
Выполните
cat .git/HEAD
Результат
$ cat .git/HEAD
ref: refs/heads/main
Файл HEAD содержит ссылку на текущую ветку, в данный момент это должна быть ветка main
.