CI 里用 --depth 1 拉的代码,构建完推回 tag,远端回 ! [remote rejected] main -> main (shallow update not allowed)。同样的脚本全量克隆就正常。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,浅克隆只有最近一次提交的历史,服务端算不出和目标分支的共同祖先,无法判断这次推送是不是快进。部分服务端还直接禁止从浅仓库接收更新。

「浅克隆推送」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

git rev-parse --is-shallow-repository
git fetch --unshallow origin
git push origin HEAD:refs/heads/main

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,在推送前执行 git fetch --unshallow 补全历史;历史太大就 git fetch --deepen=50 逐步加深到够用;确认 .git/shallow 文件已经消失;CI 配置里对需要推送的流水线改用全量克隆;只读流水线保留浅克隆 省时间。

最后用这个标准收尾,git rev-parse --is-shallow-repository 返回 false push 不再被拒。

作者 9823189