Перейти к содержанию

Git: внутренности репозитория

Если мы посмотрим, что хранится в директории .git, то увидим, среди прочего, файлы с непонятными длинными именами, которые похожи на хэши и директории, имена которых похожи на шестнадцатиричные значения.

Оказывается, идентификатор коммита используется для формирования директории и файла, содержащих сведения о коммите. Таким образом, в директории .git/objects создается директория, имя которой равно двум первым символам идентификатора коммита, а внутри этой директории создается файл, имя которого - есть оставшаяся часть идентификатора коммита.

Используя идентификаторы объектов репозитория, можно получить информацию о любом из них. Например, можно посмотреть тип объекта:

git cat-file -t 35a46c0b31d84b276a13bfc0c9ff2883eda81cc5

Если указанное значение хэша являлось идентификатором коммита, вывод будет содержать:

commit

Если теперь выполнить:

git cat-file -p 35a46c0b31d84b276a13bfc0c9ff2883eda81cc5

То мы увидим содержимое коммита (идентификаторы объектов, которые были добавлены вместе с коммитом, сведения об авторе и сообщение к коммиту). И да, идентификаторы объектов, включенных в коммит, сразу будут с типами и о них также можно узнать с помощью команды git cat-file.

Что это дает? На мой взгляд, такая возможность позволяет рассмотреть детально любой объект репозитория, не оставляя таким образом никаких "магических" метаданных и т.п. - вы можете точно знать, чем является тот или иной объект в файловой системе репозитория.