中文 (简体) ▾ 主题 ▾ 最新版本 ▾ gitrepository-layout 上次更新于 2.49.0

NAME

gitrepository-layout - Git 仓库布局

SYNOPSIS

$GIT_DIR/*

DESCRIPTION

Git 仓库有两种不同的类型

  • 工作树根目录下的 .git 目录;

  • <project>.git 目录,它是一个仓库(即没有自己的工作树),通常用于通过推送到它和从中提取来与他人交换历史记录。

注意:您也可以在工作树的根目录下有一个纯文本文件 .git,其中包含 gitdir: <path> 以指向具有仓库的真实目录。这种机制称为 gitfile,通常通过 git submodulegit worktree 命令进行管理。它通常用于子模块检出的工作树,以允许您在包含的超级项目中 git checkout 不具有子模块的分支。checkout 必须删除整个子模块工作树,而不会丢失子模块仓库。

以下内容可能存在于 Git 仓库中。

objects

与此仓库关联的对象存储。通常对象存储是自给自足的(即,通过在其中找到的对象引用的所有对象也在其中找到),但是有一些方法可以违反它。

  1. 您可以通过创建浅克隆来拥有一个不完整但本地可用的仓库。请参阅 git-clone[1]

  2. 您可以使用 objects/info/alternates$GIT_ALTERNATE_OBJECT_DIRECTORIES 机制从其他对象存储借用对象。具有这种不完整对象存储的仓库不适合发布以用于哑传输,但只要 objects/info/alternates 指向它借用的对象存储,则可以。

    如果设置了 $GIT_COMMON_DIR,则会忽略此目录,而使用 "$GIT_COMMON_DIR/objects"。

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

新创建的对象存储在其自己的文件中。对象使用 sha1 对象名称的前两个字符分散在 256 个子目录中,以保持 objects 本身中的目录条目数量在可管理的范围内。在此处找到的对象通常称为未打包(或松散)对象。

objects/pack

包(以压缩形式存储许多对象的文件,以及允许随机访问它们的索引文件)在此目录中找到。

objects/info

有关对象存储的其他信息记录在此目录中。

objects/info/packs

此文件用于帮助哑传输发现此对象存储中可用的包。每当添加或删除包时,如果仓库已发布用于哑传输,则应运行 git update-server-info 以使此文件保持最新。git repack 默认执行此操作。

objects/info/alternates

此文件记录了此对象存储从中借用对象的可选对象存储的路径,每行一个路径名。请注意,不仅本机 Git 工具在本地使用它,而且 HTTP 获取器也尝试在远程使用它;如果您在 alternates 文件中使用相对路径(相对于对象数据库,而不是仓库!),这通常会起作用,但是如果您使用绝对路径,除非文件系统和 Web URL 中的绝对路径相同,否则它将不起作用。另请参阅 objects/info/http-alternates

objects/info/http-alternates

此文件记录了此对象存储从中借用对象的可选对象存储的 URL,以便在通过 HTTP 获取仓库时使用。

refs

引用存储在此目录的子目录中。git prune 命令知道保留可从此目录及其子目录中找到的引用访问的对象。如果设置了 $GIT_COMMON_DIR,则会忽略此目录(除了 refs/bisect、refs/rewritten 和 refs/worktree),而使用 "$GIT_COMMON_DIR/refs"。

refs/heads/name

记录分支 name 的树尖提交对象

refs/tags/name

记录任何对象名称(不一定是提交对象,或指向提交对象的标签对象)。

refs/remotes/name

记录从远程仓库复制的分支的树尖提交对象。

refs/replace/<obj-sha1>

记录替换 <obj-sha1> 的对象的 SHA-1。这类似于 info/grafts,并且由 git-replace[1] 在内部使用和维护。这样的引用可以在仓库之间交换,而 grafts 则不能。

packed-refs

以更有效的方式记录与 refs/heads/、refs/tags/ 和 friends 记录的相同信息。请参阅 git-pack-refs[1]。如果设置了 $GIT_COMMON_DIR,则会忽略此文件,而使用 "$GIT_COMMON_DIR/packed-refs"。

HEAD

指向 refs/heads/ 命名空间的一个 symref(参见术语表),用于描述当前活动分支。如果仓库未与任何工作树关联(即仓库),则意义不大,但有效的 Git 仓库必须具有 HEAD 文件;某些瓷器可能会使用它来猜测仓库的指定“默认”分支(通常为 master)。如果命名分支 name 尚不存在,则是合法的。在某些旧版设置中,它是一个符号链接,而不是指向当前分支的 symref。

HEAD 还可以直接记录特定的提交,而不是指向当前分支的 symref。这种状态通常称为分离 HEAD。 有关详细信息,请参阅 git-checkout[1]

config

仓库特定的配置文件。如果设置了 $GIT_COMMON_DIR,则会忽略此文件,而使用 "$GIT_COMMON_DIR/config"。

config.worktree

在多个工作目录设置中,主工作目录的特定于工作目录的配置文件(请参阅 git-worktree[1])。

branches

一种已弃用的方式,用于存储用于指定 git fetchgit pullgit push 的 URL 的简写。文件可以存储为 branches/<name>,然后可以将 name 提供给这些命令来代替 repository 参数。有关详细信息,请参阅 git-fetch[1] 中的 REMOTES 部分。这种机制是遗留的,不太可能在现代仓库中找到。如果设置了 $GIT_COMMON_DIR,则会忽略此目录,而使用 "$GIT_COMMON_DIR/branches"。

Git 将在 Git 3.0 中停止从此目录读取 remotes。

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

该文件帮助“愚笨传输”方式发现此仓库中可用的引用(refs)。如果仓库以“愚笨传输”方式发布,则每次创建或修改标签或分支时,都应该通过 git update-server-info 重新生成此文件。通常,这是通过 hooks/update 钩子完成的,当您使用 git push 推送到仓库时,git-receive-pack 命令会运行此钩子。

info/grafts

该文件记录了虚假的提交祖先信息,用于模拟提交的父提交集与实际创建提交的方式不同。每行记录描述一个提交及其虚假父提交,通过列出它们以空格分隔并以换行符结尾的40字节十六进制对象名称。

请注意,嫁接(grafts)机制已经过时,可能导致在仓库之间传输对象时出现问题;请参阅 git-replace[1],以获得更灵活、更健壮的系统来执行相同操作。

info/exclude

按照约定,此文件存储排除模式列表。.gitignore 是每个目录的忽略文件。git statusgit addgit rmgit clean 会查看它,但核心 Git 命令不会查看它。另请参阅:gitignore[5]

info/attributes

定义要分配给路径的属性,类似于每个目录的 .gitattributes 文件。另请参阅:gitattributes[5]

info/sparse-checkout

此文件存储稀疏检出模式。另请参阅:git-read-tree[1]

remotes

存储 URL 的简写和默认引用名,以便在使用 git fetchgit pullgit push 命令与远程仓库交互时使用。有关详细信息,请参阅 git-fetch[1] 中的 REMOTES 部分。这种机制已经过时,不太可能在现代仓库中找到。如果设置了 $GIT_COMMON_DIR,则忽略此目录,而使用 "$GIT_COMMON_DIR/remotes" 代替。

Git 将在 Git 3.0 中停止从此目录读取 remotes。

logs

对引用所做的更改记录存储在此目录中。有关更多信息,请参见 git-update-ref[1]。如果设置了 $GIT_COMMON_DIR,则忽略此目录(除了 logs/HEAD),而使用 "$GIT_COMMON_DIR/logs" 代替。

logs/refs/heads/name

记录对名为 name 的分支顶端所做的所有更改。

logs/refs/tags/name

记录对名为 name 的标签所做的所有更改。

shallow

这类似于 info/grafts,但由浅克隆机制在内部使用和维护。请参阅 git-clone[1]git-fetch[1]--depth 选项。如果设置了 $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 文件的绝对路径。这用于检查链接的仓库是否已被手动删除,并且无需再保留此目录。每次访问链接的仓库时,都应更新此文件的 mtime。

worktrees/<id>/locked

如果此文件存在,则链接的工作树可能位于便携式设备上且不可用。此文件的存在阻止了 worktrees/<id>git worktree prune 自动或手动修剪。该文件可能包含一个字符串,解释了为什么该仓库被锁定。

worktrees/<id>/config.worktree

特定于工作目录的配置文件。

Git 仓库格式版本

每个 git 仓库都在其 config 文件的 core.repositoryformatversion 键中标记有一个数字版本。此版本指定了对磁盘上仓库数据进行操作的规则。不理解磁盘上仓库声明的特定版本的 git 实现绝不能对该仓库进行操作;这样做不仅会产生错误的结果,而且实际上会丢失数据。

由于此规则,版本升级应保持在绝对最小值。相反,我们通常更喜欢以下策略:

  • 提升各个数据文件(例如,索引、打包文件等)的格式版本号。这仅将不兼容性限制在这些文件上。

  • 引入新的数据,当旧客户端使用时,该数据会优雅地降级(例如,旧客户端会忽略打包位图文件,它们只是不利用它们提供的优化)。

整个仓库格式的版本升级应仅是无法独立版本控制的更改的一部分。例如,如果有人要更改对象的可达性规则或锁定引用的规则,则需要升级仓库格式版本。

请注意,这仅适用于直接访问仓库的磁盘内容。只要服务器进程理解格式 1,即使是仅理解格式 0 的旧客户端仍然可以通过 git:// 连接到使用格式 1 的仓库。

推出版本升级(无论是整个仓库还是单个文件)的首选策略是教会 git 读取新格式,并允许使用配置开关或命令行选项来编写新格式(用于实验或对于那些不关心与旧 git 兼容性的人)。然后在允许读取功能变得普遍之后经过很长一段时间,我们可以切换到默认编写新格式。

当前定义的格式版本是:

版本 0

这是由 git 的初始版本定义的格式,包括但不限于仓库目录、仓库配置文件以及对象和引用存储的格式。指定 git 的完整行为超出了本文档的范围。

版本 1

此格式与版本 0 相同,但以下例外:

  1. 读取 core.repositoryformatversion 变量时,支持版本 1 的 git 实现还必须读取在配置文件的 extensions 部分中找到的任何配置键。

  2. 如果版本 1 仓库指定了运行中的 git 尚未实现的任何 extensions.* 键,则操作绝不能继续。同样,如果实现不理解任何已知键的值,则操作绝不能继续。

请注意,如果在配置文件中未指定任何扩展,则 core.repositoryformatversion 应该设置为 0(将其设置为 1 没有任何好处,并且会使仓库与旧版本的 git 不兼容)。

已定义的扩展在 git-config[1]extensions.* 部分中给出。任何希望定义新扩展的实现都应在此处注明,以便声明该名称。

GIT

属于 git[1] 套件的一部分

scroll-to-top