{{< details >}}

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

{{< /details >}}

极狐GitLab 将代码库存储在代码库存储中。代码库存储可以是:

{{< alert type=”warning” >}}

代码库存储可以配置为指向存储代码库的目录的 path。极狐GitLab 直接访问包含代码库的目录已被弃用。您应该配置极狐GitLab 通过物理或虚拟存储访问代码库。

{{< /alert >}}

更多信息请参见:

哈希存储

{{< history >}}

  • 在极狐GitLab 14.0 中,完全移除了对基于项目路径生成代码库路径的旧存储的支持。
  • 存储名称字段在极狐GitLab 16.3 中从 Gitaly 存储名称重命名,相对路径字段在极狐GitLab 16.3 中从 Gitaly 相对路径重命名。

{{< /history >}}

哈希存储基于项目 ID 的哈希将项目存储在磁盘上的位置。这使得文件夹结构不可变,并消除了需要将状态从 URL 同步到磁盘结构的需求。这意味着重命名群组、用户或项目:

  • 仅耗费数据库事务。
  • 立即生效。

哈希还帮助更均匀地将代码库分布在磁盘上。顶级目录包含的文件夹少于顶级命名空间的总数。

哈希格式基于 SHA256 的十六进制表示,使用SHA256(project.id)计算。顶级文件夹使用前两个字符,接着是另一个文件夹,使用接下来的两个字符。它们都存储在一个特殊的 @hashed 文件夹中,因此可以与现有的旧存储项目共存。例如:

# 项目的代码库:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

# Wiki 的代码库:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"

翻译哈希存储路径

排查 Git 代码库问题、添加钩子和其他任务需要您在可读的项目名称和哈希存储路径之间转换。您可以转换:

从项目名称到哈希路径

管理员可以使用以下方法从项目名称或 ID 查找项目的哈希路径:

要在管理员区域中查找项目的哈希路径:

  1. 在左侧边栏的底部,选择 管理员
  2. 选择 概览 > 项目 并选择项目。
  3. 找到 相对路径 字段。值类似于:

    "@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
    

要使用 Rails 控制台查找项目的哈希路径:

  1. 启动 Rails 控制台
  2. 运行类似以下示例的命令(使用项目的 ID 或名称):

    Project.find(16).disk_path
    Project.find_by_full_path('group/project').disk_path
    

从哈希路径到项目名称

管理员可以使用以下方法从项目的哈希相对路径查找项目名称:

  • Rails 控制台。
  • *.git 目录中的 config 文件。

要使用 Rails 控制台查找项目名称:

  1. 启动 Rails 控制台
  2. 运行类似以下示例的命令:

    ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
    

该命令中的字符串是您可以在极狐GitLab 服务器上找到的目录树。例如,在默认的 Linux 软件包安装中,这将是 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git,目录名称末尾的 .git 已移除。

输出包括项目 ID 和项目名称。例如:

=> #<Project id:16 it/supportteam/ticketsystem>

哈希对象池

对象池是用于去重公共和内部项目的分叉的代码库,包含来自源项目的对象。使用 objects/info/alternates,源项目和分叉使用对象池共享对象。有关更多信息,请参见极狐GitLab 中 Git 对象去重的工作原理

当源项目上运行清理时,对象从源项目移动到对象池。对象池代码库与常规代码库类似地存储在名为 @pools 的目录中,而不是 @hashed

# 对象池路径
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

{{< alert type=”warning” >}}

不要在对象池代码库中运行 git prunegit gc,这些代码库存储在 @pools 目录中。这可能导致依赖于对象池的常规代码库中的数据丢失。

{{< /alert >}}

翻译哈希对象池存储路径

要使用 Rails 控制台查找项目的对象池:

  1. 启动 Rails 控制台
  2. 运行类似以下示例的命令:

    project_id = 1
    pool_repository = Project.find(project_id).pool_repository
    pool_repository = Project.find_by_full_path('group/project').pool_repository
    
    # 获取有关池代码库的更多详细信息
    pool_repository.source_project
    pool_repository.member_projects
    pool_repository.shard
    pool_repository.disk_path
    

群组 Wiki 存储

与存储在 @hashed 目录中的项目 Wiki 不同,群组 Wiki 存储在名为 @groups 的目录中。与项目 Wiki 类似,群组 Wiki 遵循哈希存储文件夹惯例,但使用群组 ID 的哈希而不是项目 ID。

例如:

# 群组 Wiki 路径
"@groups/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"

Gitaly 集群存储

如果使用 Gitaly 集群,Praefect 管理存储位置。Praefect 用于代码库的内部路径与哈希路径不同。有关更多信息,请参见Praefect 生成的副本路径

代码库文件归档缓存

用户可以通过以下方式下载代码库的 .zip.tar.gz 格式的归档:

极狐GitLab 将此归档存储在极狐GitLab 服务器上的目录缓存中。

在 Sidekiq 上运行的后台作业会定期清理此目录中的过期归档。因此,此目录必须由 Sidekiq 和极狐GitLab Workhorse 服务共同访问。如果 Sidekiq 无法访问极狐GitLab Workhorse 使用的相同目录,可能会导致包含目录的磁盘已满。

如果您不想为 Sidekiq 和极狐GitLab Workhorse 使用共享挂载,您可以配置单独的 cron 作业以从此目录中删除文件。

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

文件归档缓存的默认目录是 /var/opt/gitlab/gitlab-rails/shared/cache/archive。您可以在 /etc/gitlab/gitlab.rb 中使用 gitlab_rails['gitlab_repository_downloads_path'] 设置进行配置。

要禁用缓存:

  1. 在运行 Puma 的所有节点上设置 WORKHORSE_ARCHIVE_CACHE_DISABLED 环境变量:

    sudo -e /etc/gitlab/gitlab.rb
    
    gitlab_rails['env'] = { 'WORKHORSE_ARCHIVE_CACHE_DISABLED' => '1' }
    
  2. 重新配置更新的节点以使更改生效:

    sudo gitlab-ctl reconfigure
    

{{< /tab >}}

{{< tab title=”Helm chart (Kubernetes)” >}}

Helm chart 将缓存存储在 /srv/gitlab/shared/cache/archive 中。该目录无法配置。

要禁用缓存,您可以使用 --set gitlab.webservice.extraEnv.WORKHORSE_ARCHIVE_CACHE_DISABLED="1",或在您的 values 文件中指定以下内容:

gitlab:
  webservice:
    extraEnv:
      WORKHORSE_ARCHIVE_CACHE_DISABLED: "1"

{{< /tab >}}

{{< /tabs >}}

对象存储支持

此表显示哪些可存储对象在每种存储类型中是可存储的:

可存储对象 哈希存储 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 实现:

"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}"

# 基于对象 `oid`: `8909029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c`,路径将是:
"shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"

LFS 对象也是S3 兼容的

配置新代码库的存储位置

在您配置多个代码库存储后,您可以选择新代码库的存储位置:

  1. 在左侧边栏的底部,选择 管理员
  2. 选择 设置 > 代码库
  3. 展开 代码库存储
  4. 新代码库的存储节点 字段中输入值。
  5. 选择 保存更改

每个代码库存储路径可以分配一个 0-100 的权重。当创建新项目时,这些权重用于确定创建代码库的存储位置。

给定代码库存储路径的权重相对于其他代码库存储路径越高,选择的频率越高((存储权重) / (所有权重之和) * 100 = 概率 %)。

默认情况下,如果以前未配置代码库权重:

  • default 的权重为 100
  • 所有其他存储的权重为 0

{{< alert type=”note” >}}

如果所有存储权重均为 0(例如,当 default 不存在时),极狐GitLab 尝试在 default 上创建新代码库,而不考虑配置或 default 是否存在。

{{< /alert >}}

移动代码库

要将代码库移动到不同的代码库存储(例如,从 defaultstorage2),请使用与迁移到 Gitaly 集群相同的过程。