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
-
Хранилище объектов, связанное с этим репозиторием. Обычно хранилище объектов является самодостаточным (то есть все объекты, на которые ссылаются найденные в нём объекты, также находятся в нём), однако есть несколько способов нарушить это условие.
-
Можно создать неполный, но пригодный для локального использования репозиторий, создав неглубокий клон. См. git-clone[1].
-
Можно использовать механизмы
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
-
Этот файл помогает простым транспортам обнаруживать доступные в данном хранилище пакеты. При добавлении или удалении пакета следует запускать
gitupdate-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
-
Текущий индексный файл репозитория. Обычно отсутствует в голом репозитории.
-
Общая часть индекса, на которую ссылаются $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> автоматически или вручную командойgitworktreeprune. В файле может содержаться пояснение, почему репозиторий заблокирован. - worktrees/<id>/config.worktree
-
Файл конфигурации, относящийся к рабочему каталогу.
Версии формата репозитория Git
Каждый репозиторий Git помечен числовой версией в ключе core.repositoryformatversion файла config. Эта версия определяет правила работы с данными репозитория на диске. Реализация Git, не понимающая версию, указанную репозиторием на диске, НЕ ДОЛЖНА работать с этим репозиторием: это грозит не только получением неверных результатов, но и потерей данных.
Поэтому повышать версию следует как можно реже. Вместо этого обычно предпочтительны следующие подходы:
-
повышение номера версии формата отдельных файлов данных (например, индекса, файлов паков и т. д.). Это ограничивает несовместимость только этими файлами.
-
добавление новых данных, обработка которых в старых клиентах корректно деградирует (например, старые клиенты игнорируют файлы битмапов паков и просто не используют предоставляемую ими оптимизацию).
Повышение версии формата всего репозитория должно быть частью только тех изменений, для которых нельзя независимо версионировать отдельные компоненты. Например, изменение правил достижимости объектов или правил блокировки ссылок потребовало бы повышения версии формата репозитория.
Обратите внимание: это относится только к непосредственному доступу к содержимому репозитория на диске. Старый клиент, понимающий только формат 0, всё ещё может подключиться через git:// к репозиторию, использующему формат 1, если серверный процесс понимает формат 1.
Предпочтительный способ внедрения повышения версии (для всего репозитория или отдельного файла) — научить Git читать новый формат и разрешить запись в новом формате с помощью параметра конфигурации или параметра командной строки (для экспериментов или тех, кому не важна обратная совместимость со старыми версиями Git). Затем, после достаточно долгого периода, чтобы поддержка чтения стала распространённой, запись в новом формате может быть включена по умолчанию.
В настоящее время определены следующие версии формата:
Версия 0
Это формат, определённый первоначальной версией Git, включая, помимо прочего, формат каталога репозитория, файла конфигурации репозитория, а также хранилищ объектов и ссылок. Полное описание поведения Git выходит за рамки этого документа.
Версия 1
Этот формат идентичен версии 0, за следующими исключениями:
-
При чтении переменной
core.repositoryformatversionреализация Git, поддерживающая версию 1, также ОБЯЗАНА читать все ключи конфигурации, найденные в разделеextensionsфайла конфигурации. -
Если в репозитории версии 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