Git推送子模块至服务器后克隆出现空目录的问题咨询
问题原因 & 解决方案
为什么子模块会是空目录?
Git子模块的设计逻辑是在主仓库里只存储一个指向子模块特定提交的「指针」(Gitlink),而非直接包含第三方库的所有文件。你遇到的问题主要来自两个环节:
- 在服务器#1推送时,仅推送了主仓库的变更,未同步把子模块的更新推送到远程仓库;
- 在服务器#2克隆时,Git默认不会自动处理子模块的初始化和拉取操作,导致子模块目录为空,甚至没有对应的
.git文件。
方案1:将第三方库文件直接纳入主仓库(弃用子模块)
如果不想用子模块的指针模式,希望第三方库的所有文件和主仓库一起推送、克隆,按以下步骤操作:
- 先清理现有子模块关联:
# 解除子模块的本地关联 git submodule deinit -f -- 你的子模块目录名 # 从主仓库中移除子模块追踪 git rm -f 你的子模块目录名 # 提交移除操作 git commit -m "Remove submodule, replace with full library files" - 将第三方库的所有文件复制到主仓库的对应目录(确保原有的子模块目录已清空);
- 提交并推送这些文件:
git add 你的第三方库目录/ git commit -m "Add third-party library files directly to repo" git push origin production
之后服务器#2再执行克隆操作,就能直接拿到完整的第三方库文件,无需再处理子模块相关问题。
方案2:保留子模块,克隆时拉取完整内容
如果想继续使用子模块结构,只需在克隆过程中添加子模块相关操作,有两种实现方式:
方式A:克隆时一步到位拉取子模块
使用带参数的克隆命令,自动初始化并拉取所有子模块内容:
git clone --recurse-submodules origin production
方式B:克隆主仓库后补拉子模块
如果已经完成主仓库克隆,进入仓库目录后执行以下命令补全子模块内容:
# 初始化子模块的本地配置 git submodule init # 拉取子模块对应提交的所有内容 git submodule update
⚠️ 注意:后续在服务器#1更新子模块后,要先推送子模块的变更,再推送主仓库的指针更新:
# 进入子模块目录,推送子模块的更新 cd 你的子模块目录 git push origin 子模块分支名 # 返回主仓库,提交子模块的指针更新并推送 cd .. git add 你的子模块目录 git commit -m "Update submodule reference to latest commit" git push origin production
这样服务器#2后续拉取更新时,就能拿到最新的子模块内容了。
内容的提问来源于stack exchange,提问作者Armando Silva
相关产品推荐
相关产品推荐

