执行git submodule update时git fetch从哪个远程拉取?如何配置?
git submodule update指定fetch远程仓库解决方案
子模块fetch远程的默认规则
git submodule update执行fetch操作时的默认逻辑如下:
- 首次初始化子模块时,默认使用父仓库
.gitmodules文件中对应子模块的url字段创建名为origin的远程仓库,后续fetch默认从该远程拉取 - 若子模块已完成初始化,且未做特殊配置,git会优先查找子模块本地名为
origin的远程执行fetch,找不到时会遍历子模块所有已配置的远程尝试拉取,这就是你遇到多远程报错的核心原因
解决方法
你可以通过两种方式指定固定的fetch远程,无需将远程重命名为origin:
方式1:长期配置固定fetch远程
在父仓库根目录执行以下命令,为对应子模块绑定固定的fetch远程:git config submodule.<子模块相对路径>.remote <目标远程名>
示例:如果子模块路径为src/vendor/toolkit,要使用的远程名为official,则执行:git config submodule.src/vendor/toolkit.remote official
配置完成后再次执行git submodule update就会固定从你指定的远程拉取,不会遍历所有远程触发报错。
方式2:单次执行时指定远程
如果不需要长期配置,仅单次操作需要指定远程,可以先进入子模块手动拉取对应远程的提交,再执行update:
cd <子模块相对路径> git fetch <目标远程名> cd ../.. # 回到父仓库根目录 git submodule update
此时子模块已经缓存了需要的提交记录,update操作不会再触发多远程fetch逻辑。
报错原因说明
你遇到的fatal: --stdin can only be used when fetching from one remote报错,是Git 2.24及以上版本的优化逻辑导致:新版本git submodule update默认使用--stdin参数批量传递要拉取的提交哈希,该参数仅支持单远程场景,子模块多远程且无默认origin远程时就会触发冲突,按上述方法指定固定远程即可解决。
内容的提问来源于stack exchange,提问作者mic
相关产品推荐
相关产品推荐

