克隆含Git Submodule的公共仓库时提示repository not found错误如何解决
报错产生原因
- AWS CodeBuild的默认源码下载逻辑默认不会自动初始化和更新Git Submodule,如果你的项目依赖Submodule内容,默认的
DOWNLOAD_SOURCE阶段不会处理这部分逻辑,就会触发Submodule相关的找不到报错。 - 仓库根目录的
.gitmodules文件中配置的Submodule仓库地址有误,比如用了SSH格式的地址(git@github.com:xxx/xxx.git),而CodeBuild的默认执行环境没有配置对应的GitHub SSH密钥,哪怕是公共仓库用SSH地址拉取也会因为身份校验失败报错。 - 你指定的主分支
main下,.gitmodules中记录的Submodule commit哈希不存在,或者对应Submodule仓库本身被删除/设为私有,也会触发找不到的报错。
排查与解决方法
第一步:校验.gitmodules配置
先拉取主仓库到本地,检查根目录下的.gitmodules文件内容,确认所有Submodule的url用的是HTTPS格式(公共仓库用HTTPS无需身份校验),示例正确格式:
[submodule "xxx"] path = xxx url = https://github.com/xxx/xxx.git
如果是SSH格式的url,改成对应的HTTPS地址,提交到主仓库的main分支。
第二步:修改Build Spec配置,关闭默认源码下载,手动执行拉取逻辑
因为默认的DOWNLOAD_SOURCE阶段不处理Submodule,你需要先在CodeBuild项目的环境变量里配置CODEBUILD_SKIP_DOWNLOAD_SOURCE的值为true,跳过默认的源码下载步骤,然后修改buildspec.yml内容如下:
version: 0.2 phases: install: commands: - ./install-packages # 配置Git基础信息,避免Git弹出警告 - git config --global user.name "CodeBuild" - git config --global user.email "codebuild@example.com" # 手动拉取主仓库代码 - git clone --branch main https://github.com/queglay/firehawk.git - cd firehawk # 初始化并递归拉取所有Submodule - git submodule update --init --recursive build: commands: - echo '...replace with real build commands...' # 所有构建逻辑在firehawk目录下执行即可 artifacts: # 调整产物根目录到拉取的仓库路径下 base-directory: firehawk files: - '**/*'
第三步:特殊场景排查
如果完成上面两步还是报错,逐一检查以下内容:
- 本地手动执行
git clone --recursive https://github.com/queglay/firehawk.git,确认是否可以正常拉取所有Submodule,如果本地也报错,说明是.gitmodules里的Submodule地址配置错误,修正后重新提交即可。 - 如果Submodule是私有仓库,需要给CodeBuild配置对应的GitHub个人访问令牌(PAT),拉取的时候把PAT嵌入HTTPS地址即可。
内容的提问来源于stack exchange,提问作者openCivilisation
相关产品推荐
相关产品推荐

