Spec-Zone.ru › Git

gitrepository-layout

Имя

gitrepository-layout — структура репозитория Git

Краткое описание

$GIT_DIR/*

Описание

Репозиторий Git может иметь один из двух видов:

  • каталог .git в корне рабочего дерева;

  • каталог <project>.git, являющийся репозиторием bare (то есть без собственного рабочего дерева), который обычно используется для обмена историей с другими: в него отправляют изменения, а из него получают их.

Примечание: в корне рабочего дерева также может находиться текстовый файл .git, содержащий gitdir: <path> и указывающий на настоящий каталог с репозиторием. Этот механизм называется gitfile и обычно управляется с помощью команд git submodule и git worktree. Он часто используется для рабочего дерева извлечённого подмодуля, чтобы из содержащего его суперпроекта можно было выполнить git checkout ветки, в которой нет подмодуля. Команда checkout должна удалить всё рабочее дерево подмодуля, не потеряв сам репозиторий подмодуля.

В репозитории Git могут присутствовать следующие элементы.

objects

Хранилище объектов, связанное с этим репозиторием. Обычно хранилище объектов является самодостаточным (то есть все объекты, на которые ссылаются найденные в нём объекты, также находятся в нём), однако есть несколько способов нарушить это условие.

  1. Можно создать неполный, но пригодный для локального использования репозиторий, создав неглубокий клон. См. git-clone[1].

  2. Можно использовать механизмы objects/info/alternates или $GIT_ALTERNATE_OBJECT_DIRECTORIES, чтобы borrow объекты из других хранилищ объектов. Репозиторий с таким неполным хранилищем объектов не подходит для публикации с использованием простых транспортов, но в остальном работает нормально, если objects/info/alternates указывает на заимствуемые хранилища объектов.

    Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/objects".

objects/[0-9a-f][0-9a-f]

Каждый вновь созданный объект сохраняется в отдельном файле. Объекты распределяются по 256 подкаталогам на основе первых двух символов имени объекта sha1, чтобы число записей каталога в самом objects оставалось приемлемым. Найденные здесь объекты часто называются объектами unpacked (или loose).

objects/pack

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

objects/info

В этом каталоге хранится дополнительная информация о хранилище объектов.

objects/info/packs

Этот файл помогает простым транспортам обнаруживать доступные в данном хранилище пакеты. При добавлении или удалении пакета следует запускать git update-server-info, чтобы обновить этот файл, если репозиторий опубликован для простых транспортов. git repack делает это по умолчанию.

objects/info/alternates

В этом файле записаны пути к дополнительным хранилищам объектов, из которых данное хранилище заимствует объекты; каждый путь указывается на отдельной строке. Обратите внимание: этот файл используют не только локальные встроенные инструменты Git, но и HTTP-клиент для получения данных удалённо. Обычно это работает, если в файле alternates указаны относительные пути (относительно базы данных объектов, а не репозитория!), но не работает с абсолютными путями, если только абсолютный путь в файловой системе не совпадает с путём в URL. См. также objects/info/http-alternates.

objects/info/http-alternates

В этом файле записаны URL дополнительных хранилищ объектов, из которых данное хранилище заимствует объекты при получении данных из репозитория по HTTP.

refs

Ссылки хранятся в подкаталогах этого каталога. Команда git prune сохраняет объекты, достижимые из ссылок, найденных в этом каталоге и его подкаталогах. Этот каталог игнорируется (за исключением refs/bisect, refs/rewritten и refs/worktree), если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/refs".

refs/heads/name

содержит ссылки на коммиты, являющиеся вершинами веток name

refs/tags/name

содержит имя любого объекта (не обязательно коммита или объекта-тега, указывающего на коммит).

refs/remotes/name

содержит ссылки на коммиты, являющиеся вершинами веток, скопированных из удалённого репозитория.

refs/replace/<obj-sha1>

содержит SHA-1 объекта, заменяющего <obj-sha1>. Это похоже на info/grafts; механизм используется и поддерживается командой git-replace[1]. Такие ссылки можно передавать между репозиториями, в отличие от grafts.

packed-refs

содержит ту же информацию, что и refs/heads/, refs/tags/ и аналогичные каталоги, но в более эффективном формате. См. git-pack-refs[1]. Этот файл игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/packed-refs".

HEAD

Символическая ссылка (см. глоссарий) на пространство имён refs/heads/, обозначающая текущую активную ветку. Она не имеет особого значения, если репозиторий не связан ни с одним рабочим деревом (то есть является репозиторием bare), однако в корректном репозитории Git файл HEAD обязательно должен существовать; некоторые команды высокого уровня могут использовать его, чтобы определить предполагаемую «ветку по умолчанию» репозитория (обычно master). Допустимо, чтобы указанная ветка name ещё не существовала. В некоторых устаревших конфигурациях вместо символической ссылки используется символическая ссылка файловой системы, указывающая на текущую ветку.

Вместо символической ссылки на текущую ветку в HEAD также может быть записан непосредственно определённый коммит. Такое состояние часто называют detached HEAD.. Подробности см. в git-checkout[1].

config

Файл конфигурации конкретного репозитория. Этот файл игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/config".

config.worktree

Файл конфигурации, относящийся к рабочему каталогу для основного рабочего каталога в конфигурации с несколькими рабочими каталогами (см. git-worktree[1]).

branches

Устаревший способ хранения сокращённых обозначений для указания URL в командах git fetch, git pull и git push. Файл можно сохранить как branches/<name>, после чего вместо аргумента repository этим командам можно передавать name. Подробности см. в разделе REMOTES справочной страницы git-fetch[1]. Этот механизм устарел и в современных репозиториях обычно не встречается. Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/branches".

Начиная с Git 3.0 Git перестанет считывать удалённые репозитории из этого каталога.

hooks

Хуки — это сценарии настройки, используемые различными командами Git. При запуске git init устанавливается несколько примеров хуков, но по умолчанию все они отключены. Чтобы включить хук, необходимо переименовать файл, удалив суффикс .sample. Подробное описание каждого хука см. в githooks[5]. Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/hooks".

common

При использовании нескольких рабочих деревьев большинство файлов в $GIT_DIR относятся к отдельным рабочим деревьям, за исключением некоторых известных файлов. Однако все файлы в common являются общими для всех рабочих деревьев.

index

Текущий индексный файл репозитория. Обычно отсутствует в голом репозитории.

sharedindex.<SHA-1>

Общая часть индекса, на которую ссылаются $GIT_DIR/index и другие временные индексные файлы. Используется только в режиме разделённого индекса.

info

В этом каталоге хранится дополнительная информация о репозитории. Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/info".

info/refs

Этот файл помогает простым транспортам обнаруживать доступные в репозитории ссылки. Если репозиторий опубликован для простых транспортов, файл следует обновлять с помощью git update-server-info при каждом создании или изменении метки либо ветки. Обычно это выполняется хуком hooks/update, который запускается командой git-receive-pack при отправке изменений git push в репозиторий.

info/grafts

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

Обратите внимание: механизм grafts устарел и может вызвать проблемы при передаче объектов между репозиториями; более гибкую и надёжную систему для той же цели см. в git-replace[1].

info/exclude

Этот файл по соглашению, принятому среди команд высокого уровня, хранит список шаблонов исключения. .gitignore — файл исключений для отдельного каталога. Команды git status, git add, git rm и git clean учитывают его, а основные команды Git — нет. См. также: gitignore[5].

info/attributes

Определяет атрибуты, назначаемые пути, аналогично файлам .gitattributes для отдельных каталогов. См. также: gitattributes[5].

info/sparse-checkout

В этом файле хранятся шаблоны разреженного извлечения. См. также: git-read-tree[1].

remotes

Хранит сокращённые обозначения URL и имена ссылок по умолчанию, используемые при взаимодействии с удалёнными репозиториями командами git fetch, git pull и git push. Подробности см. в разделе REMOTES справочной страницы git-fetch[1]. Этот механизм устарел и в современных репозиториях обычно не встречается. Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/remotes".

Начиная с Git 3.0 Git перестанет считывать удалённые репозитории из этого каталога.

logs

В этом каталоге хранятся записи об изменениях ссылок. Дополнительные сведения см. в git-update-ref[1]. Этот каталог игнорируется (за исключением logs/HEAD), если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/logs".

logs/refs/heads/name

Содержит записи обо всех изменениях вершины ветки с именем name.

logs/refs/tags/name

Содержит записи обо всех изменениях метки с именем name.

shallow

Похож на info/grafts, но используется и поддерживается механизмом неглубокого клонирования. См. параметр --depth команд git-clone[1] и git-fetch[1]. Этот файл игнорируется, если задана переменная $GIT_COMMON_DIR; вместо него будет использоваться "$GIT_COMMON_DIR/shallow".

commondir

Если этот файл существует, переменной $GIT_COMMON_DIR (см. git[1]) будет присвоен указанный в нём путь, если она не задана явно. Если указанный путь относительный, он считается относительно $GIT_DIR. Репозиторий с файлом commondir неполон без репозитория, на который указывает «commondir».

modules

Содержит репозитории Git подмодулей.

worktrees

Содержит административные данные связанных рабочих деревьев. Каждый подкаталог содержит данные, относящиеся к одному связанному рабочему дереву. Этот каталог игнорируется, если задана переменная $GIT_COMMON_DIR; в этом случае вместо него будет использоваться "$GIT_COMMON_DIR/worktrees".

worktrees/<id>/gitdir

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

worktrees/<id>/locked

Если этот файл существует, связанное рабочее дерево может находиться на переносном устройстве и быть недоступным. Наличие этого файла предотвращает удаление worktrees/<id> автоматически или вручную командой git worktree prune. В файле может содержаться пояснение, почему репозиторий заблокирован.

worktrees/<id>/config.worktree

Файл конфигурации, относящийся к рабочему каталогу.

Версии формата репозитория Git

Каждый репозиторий Git помечен числовой версией в ключе core.repositoryformatversion файла config. Эта версия определяет правила работы с данными репозитория на диске. Реализация Git, не понимающая версию, указанную репозиторием на диске, НЕ ДОЛЖНА работать с этим репозиторием: это грозит не только получением неверных результатов, но и потерей данных.

Поэтому повышать версию следует как можно реже. Вместо этого обычно предпочтительны следующие подходы:

  • повышение номера версии формата отдельных файлов данных (например, индекса, файлов паков и т. д.). Это ограничивает несовместимость только этими файлами.

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

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

Обратите внимание: это относится только к непосредственному доступу к содержимому репозитория на диске. Старый клиент, понимающий только формат 0, всё ещё может подключиться через git:// к репозиторию, использующему формат 1, если серверный процесс понимает формат 1.

Предпочтительный способ внедрения повышения версии (для всего репозитория или отдельного файла) — научить Git читать новый формат и разрешить запись в новом формате с помощью параметра конфигурации или параметра командной строки (для экспериментов или тех, кому не важна обратная совместимость со старыми версиями Git). Затем, после достаточно долгого периода, чтобы поддержка чтения стала распространённой, запись в новом формате может быть включена по умолчанию.

В настоящее время определены следующие версии формата:

Версия 0

Это формат, определённый первоначальной версией Git, включая, помимо прочего, формат каталога репозитория, файла конфигурации репозитория, а также хранилищ объектов и ссылок. Полное описание поведения Git выходит за рамки этого документа.

Версия 1

Этот формат идентичен версии 0, за следующими исключениями:

  1. При чтении переменной core.repositoryformatversion реализация Git, поддерживающая версию 1, также ОБЯЗАНА читать все ключи конфигурации, найденные в разделе extensions файла конфигурации.

  2. Если в репозитории версии 1 указаны ключи extensions.*, которые используемая версия Git не поддерживает, выполнение операции НЕ ДОЛЖНО продолжаться. Аналогично, если реализация не понимает значение любого известного ключа, выполнение операции НЕ ДОЛЖНО продолжаться.

Обратите внимание: если в файле конфигурации не указаны расширения, то core.repositoryformatversion СЛЕДУЕТ установить в 0 (установка значения 1 не даёт преимуществ и делает репозиторий несовместимым со старыми реализациями Git).

Определённые расширения перечислены в разделе extensions.* справочной страницы git-config[1]. Реализация, в которой требуется определить новое расширение, должна указать его там, чтобы закрепить за собой это имя.

См. также

git-init[1], git-clone[1], git-config[1], git-fetch[1], git-pack-refs[1], git-gc[1], git-checkout[1], gitglossary[7], Руководство пользователя Git

gitrepository-layout

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/gitrepository-layout

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API