You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git clone --filter=blob:none经SSH克隆Gerrit仓库报错HTTP正常

问题根因

该故障不属于客户端环境问题,也不是SSH通用配置错误,是Gerrit实例侧的组件兼容缺陷:

  • Gerrit的HTTPS Git传输与SSH Git传输走两套独立的实现栈:HTTPS栈对Git Partial Clone(--filter=blob:none对应的部分克隆特性)的交互逻辑支持完整,因此同参数下HTTPS克隆无异常。
  • SSH栈依赖JGit内置的git-upload-pack实现,Gerrit 3.4之前的版本绑定的JGit版本未完整适配Git Protocol v2的partial clone交互规则:当客户端完成树对象拉取、进入checkout阶段按需请求缺失的blob对象时,SSH端会错误判定客户端请求的blob SHA不在初始声明的拉取列表中,直接抛出org.eclipse.jgit.transport.WantNotValidException,也就是服务端日志里记录的根异常,最终传导到客户端报"want xxx not valid"、工作树检出失败的错误。
可落地方案

按优先级从高到低选择,不需要批量修改构建任务的克隆协议:

  • 方案1(推荐):升级Gerrit版本
    升级到Gerrit 3.4及以上的稳定正式版,官方从该版本起正式合入了JGit层面的SSH partial clone完整支持代码,升级后无需额外调整配置,SSH协议下带--filter=blob:none的克隆、检出流程可完全正常运行。
  • 方案2(临时规避,适合暂无法升级的场景)
    若当前Gerrit版本低于3.4、短时间内无法完成升级,可修改Gerrit配置放开SSH端的对象请求校验:
    1. 打开Gerrit实例配置文件$GERRIT_SITE/etc/gerrit.config
    2. 添加/修改以下配置段:
      [upload]
          allowReachableSha1InWant = true
          allowTipSha1InWant = true
      
    3. 执行gerrit.sh restart重启Gerrit服务生效。

    注意:该配置会放开部分对象可达性校验,仅建议在内部可信网络环境下使用。

  • 方案3(兜底兼容,不推荐)
    若既无法升级也不能修改服务端配置,可调整客户端克隆命令逻辑:先加--no-checkout参数完成仓库克隆,进入仓库目录手动执行以下配置后再做检出:
    git config remote.origin.promisor true
    git config remote.origin.partialclonefilter blob:none
    git checkout HEAD
    
    该方案需要修改所有克隆命令,改造成本高,仅做临时应急使用。

内容的提问来源于stack exchange,提问作者gh0st

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:24:26