如何实现含嵌套GitHub仓库的项目文件夹整体提交至单一仓库?
这问题我之前也碰到过!你现在的情况是每个子文件夹都是独立的Git仓库,主仓库没法识别它们的内容——Git会把包含.git文件夹的目录当成“嵌套仓库”,默认只会跟踪这个目录的存在,不会拉取里面的内容到主仓库的远程。解决这个的正确方式是用Git子模块(submodules),它就是专门用来处理这种“主仓库包含独立子仓库”的场景的。
具体操作步骤:
准备主仓库
先进入你的project-folder目录,确保它已经是一个Git仓库(你说已经连接到GitHub了,这一步应该没问题)。如果还没初始化,先执行:git init git remote add origin <你的project-folder的GitHub仓库URL>移除现有子仓库目录(临时操作)
因为现在git-repo1和git-repo2是独立的Git仓库,主仓库没法正确跟踪它们,所以先把这两个目录移到临时位置(或者直接删除,反正它们的内容已经在各自的GitHub仓库里了):mv git-repo1 ../temp-git-repo1 mv git-repo2 ../temp-git-repo2添加子模块到主仓库
在project-folder目录下,用git submodule add命令把两个子仓库添加进来,命令里填各自的GitHub仓库URL:git submodule add <git-repo1的GitHub仓库URL> git-repo1 git submodule add <git-repo2的GitHub仓库URL> git-repo2执行完这两个命令后,主仓库里会生成一个
.gitmodules文件,里面记录了子模块的关联信息,同时git-repo1和git-repo2目录会被拉取到本地,并且主仓库会跟踪它们的当前提交版本。提交主仓库的变更
现在把主仓库的新变更提交并推送到GitHub:git add .gitmodules git-repo1 git-repo2 git commit -m "Add git-repo1 and git-repo2 as submodules" git push origin main克隆主仓库时拉取子模块
之后其他人克隆你的主仓库时,需要加上--recurse-submodules参数才能同时拉取子模块的内容:git clone --recurse-submodules <project-folder的GitHub仓库URL>如果已经克隆了主仓库,也可以手动初始化并更新子模块:
git submodule init git submodule update
后续维护注意事项:
- 当你在
git-repo1或git-repo2里提交代码并推送到它们各自的远程后,主仓库会显示子模块目录为“已修改”,这时候需要回到主仓库,提交子模块的新版本引用:git add git-repo1 git commit -m "Update git-repo1 to latest version" git push origin main - 如果要更新主仓库里的子模块到最新版本,可以执行:
git submodule update --remote git-repo1
这样设置后,访问project-folder的GitHub地址就能看到inc、git-repo1和git-repo2目录,点击git-repo1还能直接跳转到它的GitHub仓库页面;而git-repo1的仓库页面依然只显示自己的inc目录,完全不影响子仓库的独立使用。
内容的提问来源于stack exchange,提问作者Varun Sridharan




