如何跳过无权限Git子模块更新,仅更新有权限的子模块?
解决Git子模块仅更新有权限模块的方案
Git本身没有专门的内置命令直接过滤仅更新有权限的子模块,但可以通过组合Git命令和简单的shell逻辑实现通用的批量更新,同时跳过无权限的模块,而且不需要硬编码分支名:
方案1:逐个尝试更新,失败则跳过
用这条命令遍历所有子模块,逐个执行更新,遇到无权限错误时自动跳过,继续处理下一个:
git submodule foreach --recursive 'git fetch || true; git checkout $(git rev-parse @{u}) || true'
git submodule foreach --recursive:遍历所有子模块(包括嵌套的子模块,不需要的话可以去掉--recursive)git fetch || true:尝试拉取远程更新,失败时返回true,避免整个脚本终止git checkout $(git rev-parse @{u}):自动切换到子模块配置的跟踪分支的最新远程提交,@{u}会读取子模块本身的跟踪分支设置,完全不用硬编码分支名
方案2:先检查权限再更新
如果想先确认子模块可访问再更新,可以用这个bash脚本逻辑,会输出跳过的无权限模块:
git submodule foreach --quiet ' if git ls-remote --exit-code .git >/dev/null 2>&1; then git pull --ff-only else echo "跳过无权限子模块:$name" fi '
git ls-remote --exit-code:检查当前子模块的远程仓库是否能正常访问,成功返回0,失败返回非0git pull --ff-only:仅做快进更新,保持提交历史干净,同样依赖子模块自身的跟踪分支配置,不用硬编码
注意事项
- 这两个方案都是通用的,能直接在多个仓库使用,不需要针对每个仓库修改命令
- 如果你的子模块没有配置跟踪分支,需要先执行
git submodule set-branch --branch <分支名> <子模块路径>为子模块设置跟踪分支,之后就能正常用上面的命令了
内容的提问来源于stack exchange,提问作者Jayakrishna
相关产品推荐
相关产品推荐

