You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Git远程仓库添加子模块并实现递归克隆?

解决Git子模块远程仓库配置问题

问题根源

  1. Bare仓库无法直接操作子模块:Git子模块命令依赖工作树(working tree),而bare仓库没有工作目录,因此不能直接在bare仓库中执行git submodule add。
  2. 子模块URL使用本地路径导致克隆失败:添加子模块时用了本地相对路径./firmware_pci,该路径仅在当前本地环境有效,其他目录或机器递归克隆时无法访问到对应子模块仓库。

正确操作步骤

步骤1:在远程系统创建两个独立的bare仓库

分别为主项目firmware和子模块项目firmware_pci创建远程托管用的bare仓库:

# 远程系统操作
mkdir -p /path/to/remote/repos
cd /path/to/remote/repos

# 创建主项目bare仓库
mkdir firmware.git
cd firmware.git
git init --bare
cd ..

# 创建子模块项目bare仓库
mkdir firmware_pci.git
cd firmware_pci.git
git init --bare
cd ..

步骤2:本地克隆主仓库并初始化子模块项目

在本地机器操作,先克隆主仓库,再创建子模块项目并推送到远程:

# 本地系统操作
git clone /path/to/remote/repos/firmware.git
cd firmware

# 创建并初始化子模块本地仓库
mkdir firmware_pci
cd firmware_pci
git init
touch README.md  # 需添加至少一个文件,避免空仓库无法提交
git add .
git commit -m "Initial commit for firmware_pci"

# 将子模块本地仓库推送到远程bare仓库
git remote add origin /path/to/remote/repos/firmware_pci.git
git push -u origin master
cd ..

步骤3:添加远程子模块到主项目并推送

使用远程仓库的URL添加子模块,而非本地路径:

# 本地主仓库目录下操作
git submodule add /path/to/remote/repos/firmware_pci.git firmware_pci
git add .gitmodules firmware_pci
git commit -m "Add firmware_pci as submodule"
git push origin master

步骤4:测试递归克隆

在本地其他目录执行递归克隆,验证是否成功:

git clone --recursive /path/to/remote/repos/firmware.git test_firmware
cd test_firmware
# 检查子模块是否克隆成功
ls firmware_pci

关键注意事项

  • 子模块需独立远程仓库:每个子模块都要作为独立Git仓库存在,且有对应的远程bare仓库,确保递归克隆时能通过远程URL拉取。
  • 添加子模块用远程URL:禁止使用本地相对路径添加子模块,否则仅当前本地环境可访问,其他环境会出现仓库不存在的错误。
  • Bare仓库仅用于远程托管:所有子模块的添加、提交操作必须在本地非bare仓库(带工作树的仓库)中完成,再推送到远程bare仓库。

内容的提问来源于stack exchange,提问作者Yogi Wannabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:23:16