Help us learn about your current experience with the documentation. Take the survey.

仓库一致性检查

Gitaly 会执行仓库一致性检查:

  • 在触发仓库检查时。
  • 从镜像仓库获取更改时。
  • 用户将更改推送到仓库时。

这些一致性检查会验证仓库是否包含所有必需的对象,以及这些对象是否为有效对象。它们可以分为以下几类:

  • 基本检查:确保仓库不会损坏。这包括连通性检查和对象可解析性检查。
  • 安全检查:识别可用于利用 Git 过去安全漏洞的对象。
  • 外观检查:验证所有对象元数据是否有效。较旧的 Git 版本和其他 Git 实现可能生成了元数据无效的对象,但较新版本可以解释这些格式不正确的对象。

移除未通过一致性检查的格式不正确的对象需要重写仓库历史,而这通常无法做到。因此,Gitaly 默认会禁用一系列不会对仓库一致性产生负面影响的外观问题检查

默认情况下,Gitaly 不会禁用基本检查或安全相关检查,以免分发可能触发 Git 客户端中已知漏洞的对象。这也限制了导入包含此类对象的仓库的能力,即使项目没有恶意意图。

覆盖仓库一致性检查

如果实例管理员必须处理未通过一致性检查的仓库,他们可以覆盖这些检查。

对于 Linux 包安装,请编辑 /etc/gitlab/gitlab.rb 并设置以下键(在此示例中,为禁用 hasDotgit 一致性检查):

ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

gitaly['configuration'] = {
  # ...
  git: {
    # ...
    config: [
      # 在文件中每行填入一个完整的 SHA-1 值。
      # 参见 https://git-scm.com/docs/git-config#Documentation/git-config.txt-fsckskipList
      { key: "fsck.skipList", value: ignored_blobs },
      { key: "fetch.fsck.skipList", value: ignored_blobs },
      { key: "receive.fsck.skipList", value: ignored_blobs },

      { key: "fsck.hasDotgit", value: "ignore" },
      { key: "fetch.fsck.hasDotgit", value: "ignore" },
      { key: "receive.fsck.hasDotgit", value: "ignore" },
      { key: "fsck.missingSpaceBeforeEmail", value: "ignore" },
    ],
  },
}

对于自行编译安装,请编辑 Gitaly 配置文件 (gitaly.toml) 进行等效设置:

[[git.config]]
key = "fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "fetch.fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "receive.fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "fetch.fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "receive.fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

[[git.config]]
key = "fetch.fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

[[git.config]]
key = "receive.fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

已禁用的检查

为了使 Gitaly 仍能与具有某些不影响安全性或 Gitaly 客户端的格式不正确特征的仓库一起工作,Gitaly 默认会禁用一部分外观检查

有关一致性检查的完整列表,请参阅 Git 文档

badTimezone

badTimezone 检查被禁用,是因为 Git 中曾有一个 bug,导致用户创建了时区无效的提交。因此,一些 Git 日志中包含不符合规范的提交。由于 Gitaly 默认会对收到的 packfiles 运行 fsck,任何包含此类提交的推送都将被拒绝。

missingSpaceBeforeDate

missingSpaceBeforeDate 检查被禁用,是因为当签名中的邮箱和日期之间没有空格,或者日期完全缺失时,git-fsck(1) 会失败。这可能是由多种问题引起的,包括行为异常的 Git 客户端。

zeroPaddedFilemode

zeroPaddedFilemode 检查被禁用,是因为较旧的 Git 版本曾对某些文件模式进行零填充。例如,文件模式不是 40000,而是被树对象编码为 040000