仓库一致性检查

Gitaly 运行仓库一致性检查:

  1. 触发仓库检查时。
  2. 从镜像仓库获取更改时。
  3. 用户推送更改到仓库时。

这些一致性检查验证仓库是否具有所有必需的对象,并且这些对象是否有效。它们可以分类为:

  1. 基本检查,断言仓库不会被破坏。这包括连接性检查和对象是否可以解析的检查。
  2. 安全检查,识别适合利用 Git 过去安全相关漏洞的对象。
  3. 美观检查,验证所有对象元数据是否有效。旧版本 Git 和其他 Git 实现可能产生了具有无效元数据的对象,但新版本可以解释这些格式错误的对象。

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

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

覆盖仓库一致性检查

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

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

  1. 在极狐GitLab 15.10及更高版本中:

    ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"
    
    gitaly['configuration'] = {
      # ...
      git: {
        # ...
        config: [
          # Populate a file with one unabbreviated SHA-1 per line.
          # See 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" },
        ],
      },
    }
    
  2. 在极狐GitLab 15.3 至极狐GitLab 15.9 中:

    ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"
    
    gitaly['gitconfig'] = [
    
     # Populate a file with one unabbreviated SHA-1 per line.
     # See 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" },
    ]
    
  3. 在 极狐GitLab 15.2 及更早版本(遗留方法)中:

    ignored_git_errors = [
      "hasDotgit = ignore",
      "missingSpaceBeforeEmail = ignore",
    ]
    omnibus_gitconfig['system'] = {
    
     # Populate a file with one unabbreviated SHA-1 per line.
     # See https://git-scm.com/docs/git-config#Documentation/git-config.txt-fsckskipList
      "fsck.skipList" => ignored_blobs
      "fetch.fsck.skipList" => ignored_blobs,
      "receive.fsck.skipList" => ignored_blobs,
    
      "fsck" => ignored_git_errors,
      "fetch.fsck" => ignored_git_errors,
      "receive.fsck" => ignored_git_errors,
    }
    

对于自编译安装,编辑 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 中存在一个错误,导致用户创建具有无效时区的提交。结果,一些 Git 日志包含不符合规范的提交。因为 Gitaly 默认在接收到的 packfiles 上运行 fsck,任何包含此类提交的推送都会被拒绝。

missingSpaceBeforeDate

missingSpaceBeforeDate 检查被禁用,因为 git-fsck(1) 在签名与日期之间没有空格或者日期完全缺失时失败。这可能是由于各种问题导致的,包括 Git 客户端表现异常。

zeroPaddedFilemode

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