仓库存储
Tier: 基础版, 专业版, 旗舰版
Offering: 私有化部署
极狐GitLab 将代码库存储在代码库存储中。代码库存储可以是:
更多信息请参见:
- 配置 Gitaly,参见配置 Gitaly。
- 配置 Gitaly 集群,参见配置 Gitaly 集群。
哈希存储
版本历史
- 在极狐GitLab 14.0 中,完全移除了对基于项目路径生成代码库路径的旧存储的支持。
- 存储名称字段在极狐GitLab 16.3 中从 Gitaly 存储名称重命名,相对路径字段在极狐GitLab 16.3 中从 Gitaly 相对路径重命名。
哈希存储基于项目 ID 的哈希将项目存储在磁盘上的位置。这使得文件夹结构不可变,并消除了需要将状态从 URL 同步到磁盘结构的需求。这意味着重命名群组、用户或项目:
- 仅耗费数据库事务。
- 立即生效。
哈希还帮助更均匀地将代码库分布在磁盘上。顶级目录包含的文件夹少于顶级命名空间的总数。
哈希格式基于 SHA256 的十六进制表示,使用SHA256(project.id)计算。顶级文件夹使用前两个字符,接着是另一个文件夹,使用接下来的两个字符。它们都存储在一个特殊的 @hashed 文件夹中,因此可以与现有的旧存储项目共存。例如:
ruby# 项目的代码库: "@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git" # Wiki 的代码库: "@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
翻译哈希存储路径
排查 Git 代码库问题、添加钩子和其他任务需要您在可读的项目名称和哈希存储路径之间转换。您可以转换:
从项目名称到哈希路径
管理员可以使用以下方法从项目名称或 ID 查找项目的哈希路径:
- 管理员区域。
- Rails 控制台。
要在管理员区域中查找项目的哈希路径:
-
在左侧边栏的底部,选择 管理员。
-
选择 概览 > 项目 并选择项目。
-
找到 相对路径 字段。值类似于:
plaintext"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
要使用 Rails 控制台查找项目的哈希路径:
-
启动 Rails 控制台。
-
运行类似以下示例的命令(使用项目的 ID 或名称):
rubyProject.find(16).disk_path Project.find_by_full_path('group/project').disk_path
从哈希路径到项目名称
管理员可以使用以下方法从项目的哈希相对路径查找项目名称:
- Rails 控制台。
- *.git 目录中的 config 文件。
要使用 Rails 控制台查找项目名称:
-
启动 Rails 控制台。
-
运行类似以下示例的命令:
rubyProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
该命令中的字符串是您可以在极狐GitLab 服务器上找到的目录树。例如,在默认的 Linux 软件包安装中,这将是 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git,目录名称末尾的 .git 已移除。
输出包括项目 ID 和项目名称。例如:
plaintext=> #<Project id:16 it/supportteam/ticketsystem>
哈希对象池
对象池是用于去重公共和内部项目的分叉的代码库,包含来自源项目的对象。使用 objects/info/alternates,源项目和分叉使用对象池共享对象。有关更多信息,请参见极狐GitLab 中 Git 对象去重的工作原理。
当源项目上运行清理时,对象从源项目移动到对象池。对象池代码库与常规代码库类似地存储在名为 @pools 的目录中,而不是 @hashed。
ruby# 对象池路径 "@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
翻译哈希对象池存储路径
要使用 Rails 控制台查找项目的对象池:
-
启动 Rails 控制台。
-
运行类似以下示例的命令:
ruby1project_id = 1 2pool_repository = Project.find(project_id).pool_repository 3pool_repository = Project.find_by_full_path('group/project').pool_repository 4 5# 获取有关池代码库的更多详细信息 6pool_repository.source_project 7pool_repository.member_projects 8pool_repository.shard 9pool_repository.disk_path
群组 Wiki 存储
与存储在 @hashed 目录中的项目 Wiki 不同,群组 Wiki 存储在名为 @groups 的目录中。与项目 Wiki 类似,群组 Wiki 遵循哈希存储文件夹惯例,但使用群组 ID 的哈希而不是项目 ID。
例如:
ruby# 群组 Wiki 路径 "@groups/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
Gitaly 集群存储
如果使用 Gitaly 集群,Praefect 管理存储位置。Praefect 用于代码库的内部路径与哈希路径不同。有关更多信息,请参见Praefect 生成的副本路径。
代码库文件归档缓存
用户可以通过以下方式下载代码库的 .zip 或 .tar.gz 格式的归档:
- 极狐GitLab UI。
- 代码库 API。
极狐GitLab 将此归档存储在极狐GitLab 服务器上的目录缓存中。
在 Sidekiq 上运行的后台作业会定期清理此目录中的过期归档。因此,此目录必须由 Sidekiq 和极狐GitLab Workhorse 服务共同访问。如果 Sidekiq 无法访问极狐GitLab Workhorse 使用的相同目录,可能会导致包含目录的磁盘已满。
如果您不想为 Sidekiq 和极狐GitLab Workhorse 使用共享挂载,您可以配置单独的 cron 作业以从此目录中删除文件。
文件归档缓存的默认目录是 /var/opt/gitlab/gitlab-rails/shared/cache/archive。您可以在 /etc/gitlab/gitlab.rb 中使用 gitlab_rails['gitlab_repository_downloads_path'] 设置进行配置。
要禁用缓存:
-
在运行 Puma 的所有节点上设置 WORKHORSE_ARCHIVE_CACHE_DISABLED 环境变量:
shellsudo -e /etc/gitlab/gitlab.rbrubygitlab_rails['env'] = { 'WORKHORSE_ARCHIVE_CACHE_DISABLED' => '1' } -
重新配置更新的节点以使更改生效:
shellsudo gitlab-ctl reconfigure
对象存储支持
此表显示哪些可存储对象在每种存储类型中是可存储的:
| 可存储对象 | 哈希存储 | S3 兼容 |
|---|---|---|
| 代码库 | 是 | - |
| 附件 | 是 | - |
| 头像 | 否 | - |
| 页面 | 否 | - |
| Docker 注册表 | 否 | - |
| CI/CD 作业日志 | 否 | - |
| CI/CD 产物 | 否 | 是 |
| CI/CD 缓存 | 否 | 是 |
| LFS 对象 | 类似 | 是 |
| 代码库池 | 是 | - |
存储在 S3 兼容端点中的文件可以具有与哈希存储相同的优势,只要它们不以 #{namespace}/#{project_name} 作为前缀。这对于 CI/CD 缓存和 LFS 对象是正确的。
头像
每个文件都存储在与其在数据库中分配的 id 匹配的目录中。用户头像的文件名总是 avatar.png。当头像被替换时,Upload 模型被销毁,并替换为具有不同 id 的新模型。
CI/CD 产物
CI/CD 产物是 S3 兼容的。
LFS 对象
极狐GitLab 中的 LFS 对象实现了类似的存储模式,使用两个字符和两级文件夹,遵循 Git 实现:
ruby"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}" # 基于对象 `oid`: `8909029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c`,路径将是: "shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"
LFS 对象也是S3 兼容的。
配置新代码库的存储位置
在您配置多个代码库存储后,您可以选择新代码库的存储位置:
- 在左侧边栏的底部,选择 管理员。
- 选择 设置 > 代码库。
- 展开 代码库存储。
- 在 新代码库的存储节点 字段中输入值。
- 选择 保存更改。
每个代码库存储路径可以分配一个 0-100 的权重。当创建新项目时,这些权重用于确定创建代码库的存储位置。
给定代码库存储路径的权重相对于其他代码库存储路径越高,选择的频率越高((存储权重) / (所有权重之和) * 100 = 概率 %)。
默认情况下,如果以前未配置代码库权重:
- default 的权重为 100。
- 所有其他存储的权重为 0。
移动代码库
要将代码库移动到不同的代码库存储(例如,从 default 到 storage2),请使用与迁移到 Gitaly 集群相同的过程。