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

能否将多个保留独立Git历史的仓库放入同一文件夹并推送到GitHub?

实现方案:用Git Subtree(完美贴合你的需求)

你的需求核心是把多个带独立Git历史的项目合并到同一个GitHub仓库,同时保留各自历史、无需额外创建仓库,其实Git Subtree比你关注的Submodule更适配这个场景——Submodule通常依赖子项目的远程仓库,而Subtree可以直接把本地子项目的完整历史合并到父仓库的指定子目录下,所有内容都在同一个仓库里,还能保留各项目的独立提交记录。

具体操作步骤

1. 创建并初始化父仓库

  • 新建一个文件夹作为所有项目的根目录,比如命名为all-my-projects
  • 进入这个文件夹,初始化Git仓库:
    git init
    
  • 去GitHub创建一个空仓库,然后把本地父仓库和远程关联:
    git remote add origin <你的GitHub仓库地址>
    

2. 合并子项目到父仓库(保留独立历史)

针对每个有本地Git历史的子项目,执行以下操作:

  • 回到父仓库根目录,运行subtree添加命令:
    git subtree add --prefix=<子项目在父仓库的存放路径> <子项目本地绝对路径> <子项目的分支名,比如main>
    
    举个实际例子:如果你的本地子项目路径是/Users/xxx/projects/blog,想把它放到父仓库的blog文件夹下,子项目用的是main分支,命令就是:
    git subtree add --prefix=blog /Users/xxx/projects/blog main
    
  • 这个命令会把子项目的所有历史记录完整合并到父仓库的blog目录下,之后你可以用git log -- blog单独查看这个子项目的所有提交,和父仓库的其他历史完全独立。

3. 推送所有内容到GitHub

等所有子项目都添加完成后,提交并推送到远程仓库:

git add .
git commit -m "添加所有子项目作为subtree"
git push origin main

4. 后续维护(更新/修改子项目)

  • 如果本地子项目有更新,回到父仓库可以用这条命令同步:
    git subtree pull --prefix=blog /Users/xxx/projects/blog main
    
  • 如果在父仓库里修改了子项目的内容,也可以把修改推回本地子项目(按需操作):
    git subtree push --prefix=blog /Users/xxx/projects/blog main
    

为什么不推荐你想的重命名.git的方法?

手动改.git文件夹虽然能临时切换历史,但操作繁琐还容易出错——比如不小心覆盖文件、忘记切换状态导致提交混乱,而且其他人克隆仓库后还要手动恢复,完全不符合Git的协作逻辑,属于“野路子”,不建议用。

关于Submodule的补充说明

如果你还是想尝试Submodule,理论上也能操作,但有个关键问题:Submodule的机制是父仓库只记录子项目的当前commit哈希,不会包含子项目的实际内容;如果子项目没有远程仓库,其他人克隆你的父仓库后,根本拉取不到子项目的内容。所以相比之下,Subtree完全满足你“所有内容在同一个GitHub仓库”的核心需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:22:37