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端的对象请求校验:- 打开Gerrit实例配置文件
$GERRIT_SITE/etc/gerrit.config - 添加/修改以下配置段:
[upload] allowReachableSha1InWant = true allowTipSha1InWant = true - 执行
gerrit.sh restart重启Gerrit服务生效。
注意:该配置会放开部分对象可达性校验,仅建议在内部可信网络环境下使用。
- 打开Gerrit实例配置文件
- 方案3(兜底兼容,不推荐)
若既无法升级也不能修改服务端配置,可调整客户端克隆命令逻辑:先加--no-checkout参数完成仓库克隆,进入仓库目录手动执行以下配置后再做检出:
该方案需要修改所有克隆命令,改造成本高,仅做临时应急使用。git config remote.origin.promisor true git config remote.origin.partialclonefilter blob:none git checkout HEAD
内容的提问来源于stack exchange,提问作者gh0st
相关产品推荐
相关产品推荐

