仓库一致性检查
Gitaly 运行仓库一致性检查:
- 触发仓库检查时。
- 从镜像仓库获取更改时。
- 用户推送更改到仓库时。
这些一致性检查验证仓库是否具有所有必需的对象,并且这些对象是否有效。它们可以分类为:
- 基本检查,断言仓库不会被破坏。这包括连接性检查和对象是否可以解析的检查。
- 安全检查,识别适合利用 Git 过去安全相关漏洞的对象。
- 美观检查,验证所有对象元数据是否有效。旧版本 Git 和其他 Git 实现可能产生了具有无效元数据的对象,但新版本可以解释这些格式错误的对象。
移除不通过一致性检查的格式错误对象需要重写仓库的历史记录,这通常无法做到。因此,Gitaly 默认 禁用了一系列美观问题的一致性检查,这些问题不会对仓库一致性产生负面影响。
默认情况下,Gitaly 不会禁用基本或安全相关检查,以避免分发可能在 Git 客户端中触发已知漏洞的对象。这也限制了即使项目没有恶意意图也无法导入包含这些对象的仓库。
覆盖仓库一致性检查
实例管理员可以覆盖一致性检查,如果他们必须处理不通过一致性检查的仓库。
对于 Linux 软件包安装,编辑 /etc/gitlab/gitlab.rb
并设置以下键(在此示例中,禁用 hasDotgit
一致性检查):
-
在极狐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" }, ], }, }
-
在极狐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" }, ]
-
在 极狐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
。