GitLab CI/CD中git submodule update --init无法拉取子模块所有分支的问题
GitLab CI/CD中git submodule update --init无法拉取子模块所有分支的问题
我来帮你捋捋这个问题,其实这是git submodule的默认行为导致的,咱们一步步解决:
首先得明白为啥看不到master分支:当你执行git submodule update --init时,Git只会把子模块拉取到父仓库所关联的那个特定commit上,这时候子模块处于**分离头指针(detached HEAD)**状态——简单说就是本地只存在那个特定commit的引用,并没有同步远程仓库的所有分支信息,所以你用git branch -a看不到master分支是正常的。
接下来给你两个可行的解决方案:
方案一:手动在脚本中拉取远程分支信息
修改你的CI脚本,进入子模块目录后先同步远程所有分支的信息,再切换到master拉取最新代码:
Test_submodule: stage: tests image: name: ..... entrypoint: [""] script: - git submodule update --init - cd submodule_dir # 同步远程仓库的所有分支信息到本地 - git fetch origin # 现在就能看到远程的master分支了,切换到本地master并关联远程 - git checkout master # 拉取master分支的最新代码 - git pull origin master
方案二:结合GitLab的子模块策略变量优化
你已经尝试过GIT_SUBMODULE_STRATEGY: normal,这个变量会让GitLab自动帮你完成子模块的初始化和更新操作(相当于替你执行了git submodule update --init),所以可以简化脚本,只保留后续的分支操作:
variables: GIT_SUBMODULE_STRATEGY: normal Test_submodule: stage: tests image: name: ..... entrypoint: [""] script: - cd submodule_dir - git fetch origin - git checkout master - git pull origin master
额外注意点
- 要确保GitLab Runner拥有访问子模块仓库B的权限,比如正确配置了SSH密钥或者CI_TOKEN,不然
git fetch和git pull会因为权限问题失败; - 确认子模块B的远程分支名确实是
master,现在很多仓库默认分支是main,如果是后者记得替换成对应的分支名。
备注:内容来源于stack exchange,提问作者ashishpm
相关产品推荐
相关产品推荐

