Git:将本地Git子模块(含子模块文件)推送到远程裸仓库
Git子模块远程推送问题解决方案
看起来你遇到的是Git子模块推送的典型问题——父仓库的远程默认只存储子模块的提交哈希值,而不是子模块的实际文件内容。要让父仓库A的远程能正确关联并展示子模块B的内容,得确保子模块自己的远程仓库有对应的提交,同时父仓库引用的是已推送的子模块提交。下面一步步帮你解决:
一、先确认子模块B的远程配置与推送
Git子模块本身是独立的Git仓库,它的内容需要先推送到自己的远程仓库,父仓库A里只是记录B的某个提交ID。如果B没有远程或者本地提交没推过去,父仓库推到远程后,子模块目录会是空的或者无法拉取内容。
- 进入子模块B的目录,检查远程仓库配置:
cd path/to/projectB git remote -v - 如果没有看到远程仓库地址,先给B添加远程:
git remote add origin <你的项目B远程仓库地址> - 把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的文件:
- 先移除现有子模块:
git submodule deinit -f path/to/projectB git rm -f path/to/projectB - 添加子树:
git subtree add --prefix=path/to/projectB <项目B远程地址> main --squash - 后续更新B的内容:
git subtree pull --prefix=path/to/projectB <项目B远程地址> main --squash git push origin main
这样操作后,项目A的远程仓库就会包含B的所有文件内容了。
内容的提问来源于stack exchange,提问作者k.stm
相关产品推荐
相关产品推荐

