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

Git:将本地Git子模块(含子模块文件)推送到远程裸仓库

Git子模块远程推送问题解决方案

看起来你遇到的是Git子模块推送的典型问题——父仓库的远程默认只存储子模块的提交哈希值,而不是子模块的实际文件内容。要让父仓库A的远程能正确关联并展示子模块B的内容,得确保子模块自己的远程仓库有对应的提交,同时父仓库引用的是已推送的子模块提交。下面一步步帮你解决:

一、先确认子模块B的远程配置与推送

Git子模块本身是独立的Git仓库,它的内容需要先推送到自己的远程仓库,父仓库A里只是记录B的某个提交ID。如果B没有远程或者本地提交没推过去,父仓库推到远程后,子模块目录会是空的或者无法拉取内容。

  1. 进入子模块B的目录,检查远程仓库配置:
    cd path/to/projectB
    git remote -v
    
  2. 如果没有看到远程仓库地址,先给B添加远程:
    git remote add origin <你的项目B远程仓库地址>
    
  3. 把B的本地提交推送到它的远程仓库:
    git push origin main  # 替换成你实际使用的分支名,比如master
    

二、更新父仓库A的子模块引用

回到父仓库A,确保你记录的子模块B的提交ID是已经推送到B远程的那个版本:

cd ../  # 回到项目A的根目录
git add path/to/projectB
git commit -m "Update submodule B to latest pushed commit"

三、推送父仓库A到远程

现在用带递归子模块参数的推送命令,确保子模块的提交已同步:

git push --recurse-submodules=on-demand

这个命令会自动检查子模块的当前提交是否已推送到它的远程,如果没推,会帮你推送子模块,再推送父仓库。如果想先检查再推送(避免意外),可以用:

git push --recurse-submodules=check

这个命令会在子模块未推送时直接报错,提醒你先处理子模块的推送。

备选方案:如果想让A的远程直接包含B的所有文件

如果你其实希望项目A的远程仓库直接包含B的所有文件(而不是作为独立子模块存在),那Git子树(git subtree)会更适合,子树会把B的内容合并到A的仓库中,推送A时自然包含B的文件:

  1. 先移除现有子模块:
    git submodule deinit -f path/to/projectB
    git rm -f path/to/projectB
    
  2. 添加子树:
    git subtree add --prefix=path/to/projectB <项目B远程地址> main --squash
    
  3. 后续更新B的内容:
    git subtree pull --prefix=path/to/projectB <项目B远程地址> main --squash
    git push origin main
    

这样操作后,项目A的远程仓库就会包含B的所有文件内容了。

内容的提问来源于stack exchange,提问作者k.stm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:48:20