如何将完整Git仓库存储至父Git仓库中?
解决方案:完整存储子仓库(含.git元数据)到父仓库
我完全理解你的需求——你手里有大量无人维护的子仓库,既想把它们完整备份到父仓库里(包括.git元数据),防止上游仓库消失或被强制推送篡改,又要保留合并上游新变更和个人修改的能力。而Git默认要么忽略.git目录,要么用submodule,但submodule依赖上游仓库存在的问题确实头疼,一旦上游没了连递归克隆都做不了。
下面是两种贴合你场景的方法:
方法一:强制将完整子仓库纳入父仓库(最直接满足需求)
Git默认会忽略.git目录,但我们可以通过强制添加的方式,把子仓库的所有内容(包括.git)作为普通文件提交到父仓库:
- 把目标子仓库完整复制到父仓库的指定子目录下,比如
backup-repos/old-repo-1 - 进入父仓库的根目录,执行强制添加命令:
这里的git add -f backup-repos/old-repo-1/-f参数是关键,它会绕过Git对.git目录的默认忽略规则 - 提交备份:
git commit -m "Backup full repo old-repo-1 including .git metadata"
优势与注意事项
- 完全独立于上游:即使子仓库的上游远程消失,你从父仓库克隆后,只需要把
backup-repos/old-repo-1目录单独拿出来,就是一个完整可用的Git仓库,所有历史、分支、本地修改都完好无损 - 保留合并能力:你可以随时进入这个子目录,像操作普通Git仓库一样拉取上游变更(如果上游还存在)、合并个人修改,之后回到父仓库重新执行
git add -f和提交,就能更新备份 - 体积注意:父仓库的体积会因为包含子仓库的完整历史而增大,如果子仓库数量多、体积大,要考虑存储容量的问题
- 操作规范:尽量避免在父仓库层面直接修改子仓库的文件,所有变更都在子仓库目录内用Git完成后,再同步到父仓库备份
方法二:使用git subtree(适合不需要保留.git目录,但要同步上游的场景)
如果你不需要严格保留子仓库的.git目录,只是想备份代码并保留同步能力,git subtree也是一个不错的选择:
- 在父仓库中添加子仓库作为subtree:
git subtree add --prefix=subtree-repos/old-repo-1 <子仓库远程URL> main - 拉取上游最新变更:
git subtree pull --prefix=subtree-repos/old-repo-1 <子仓库远程URL> main - 提交自己的修改到父仓库:
git add subtree-repos/old-repo-1/ git commit -m "Update subtree repo old-repo-1 with latest changes"
优势与局限
- 不需要处理
.git目录的忽略问题,代码直接合并到父仓库的目录中 - 可以正常拉取上游变更,也能推送自己的修改到上游(如果有权限)
- 但不保留子仓库的独立.git元数据,如果上游消失,你只能拿到当前的代码状态,无法恢复子仓库的完整历史和分支
根据你的核心诉求,方法一显然更贴合——它完美解决了备份完整仓库、防上游丢失、保留合并能力的问题。
内容的提问来源于stack exchange,提问作者timakro
相关产品推荐
相关产品推荐

