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

Git推送子模块至服务器后克隆出现空目录的问题咨询

问题原因 & 解决方案

为什么子模块会是空目录?

Git子模块的设计逻辑是在主仓库里只存储一个指向子模块特定提交的「指针」(Gitlink),而非直接包含第三方库的所有文件。你遇到的问题主要来自两个环节:

  • 在服务器#1推送时,仅推送了主仓库的变更,未同步把子模块的更新推送到远程仓库;
  • 在服务器#2克隆时,Git默认不会自动处理子模块的初始化和拉取操作,导致子模块目录为空,甚至没有对应的.git文件。

方案1:将第三方库文件直接纳入主仓库(弃用子模块)

如果不想用子模块的指针模式,希望第三方库的所有文件和主仓库一起推送、克隆,按以下步骤操作:

  1. 先清理现有子模块关联:
    # 解除子模块的本地关联
    git submodule deinit -f -- 你的子模块目录名
    # 从主仓库中移除子模块追踪
    git rm -f 你的子模块目录名
    # 提交移除操作
    git commit -m "Remove submodule, replace with full library files"
    
  2. 将第三方库的所有文件复制到主仓库的对应目录(确保原有的子模块目录已清空);
  3. 提交并推送这些文件:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:23:56