已开启
build_build.sh 中 set -e 使 git submodule update 失败时的降级重试成为死代码 #12
此账号已注销创建于  8月14日
8月14日 创建

问题现象

build_build.sh 第 3 行开启了 set -e,而 init_submodules() 里写了这样一段降级重试:

set -e
...

init_submodules() {
    ...
    git submodule update --recursive --remote

    if [ $? -ne 0 ]; then
        log_warn "子模块更新失败,尝试仅同步当前提交..."
        git submodule update --recursive
    fi
    ...
}

问题分析

在 set -e 生效的情况下,git submodule update --recursive --remote 一旦返回非零,bash 会立即终止整个脚本,根本不会执行后面的 if [ $? -ne 0 ] 判断。因此 git submodule update --recursive 这条降级路径是死代码,永远不可能被执行。

即:作者希望"远程分支同步失败时回退到本地 commit 同步",但实际效果是"远程同步失败就直接退出",与预期相反。

建议

把降级逻辑改成短路形式,让失败退出不触发 set -e:

git submodule update --recursive --remote || {
    log_warn "子模块更新失败,尝试仅同步当前提交..."
    git submodule update --recursive
}

或临时 set +e 后再检查 $?。建议顺手排查脚本里其他 if [ $? -ne 0 ] 的写法是否存在同样的 set -e 冲突。

likedislike
glucat
glucat成员
8月18日 评论:

感谢指正,set -e 下子模块更新失败即退出,降级重试确为死代码。我们会对构建脚本进行整改,感谢反馈。

likedislike