You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现含嵌套GitHub仓库的项目文件夹整体提交至单一仓库?

解决方案:使用Git子模块实现主仓库包含独立子仓库

这问题我之前也碰到过!你现在的情况是每个子文件夹都是独立的Git仓库,主仓库没法识别它们的内容——Git会把包含.git文件夹的目录当成“嵌套仓库”,默认只会跟踪这个目录的存在,不会拉取里面的内容到主仓库的远程。解决这个的正确方式是用Git子模块(submodules),它就是专门用来处理这种“主仓库包含独立子仓库”的场景的。

具体操作步骤:

  1. 准备主仓库
    先进入你的project-folder目录,确保它已经是一个Git仓库(你说已经连接到GitHub了,这一步应该没问题)。如果还没初始化,先执行:

    git init
    git remote add origin <你的project-folder的GitHub仓库URL>
    
  2. 移除现有子仓库目录(临时操作)
    因为现在git-repo1git-repo2是独立的Git仓库,主仓库没法正确跟踪它们,所以先把这两个目录移到临时位置(或者直接删除,反正它们的内容已经在各自的GitHub仓库里了):

    mv git-repo1 ../temp-git-repo1
    mv git-repo2 ../temp-git-repo2
    
  3. 添加子模块到主仓库
    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-repo1git-repo2目录会被拉取到本地,并且主仓库会跟踪它们的当前提交版本。

  4. 提交主仓库的变更
    现在把主仓库的新变更提交并推送到GitHub:

    git add .gitmodules git-repo1 git-repo2
    git commit -m "Add git-repo1 and git-repo2 as submodules"
    git push origin main
    
  5. 克隆主仓库时拉取子模块
    之后其他人克隆你的主仓库时,需要加上--recurse-submodules参数才能同时拉取子模块的内容:

    git clone --recurse-submodules <project-folder的GitHub仓库URL>
    

    如果已经克隆了主仓库,也可以手动初始化并更新子模块:

    git submodule init
    git submodule update
    

后续维护注意事项:

  • 当你在git-repo1git-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地址就能看到incgit-repo1git-repo2目录,点击git-repo1还能直接跳转到它的GitHub仓库页面;而git-repo1的仓库页面依然只显示自己的inc目录,完全不影响子仓库的独立使用。

内容的提问来源于stack exchange,提问作者Varun Sridharan

火山引擎 最新活动