如何合并Git仓库?保留提交历史备份无权限转移的仓库并分组
合并多仓库到单仓库并保留提交历史的方案
推荐方法:使用git subtree(比submodule更易维护)
这种方式能把每个源仓库的完整提交历史迁移到目标仓库的指定目录下,后续管理更直观,无需处理子模块的复杂配置。
步骤1:创建并初始化目标仓库labs
# 本地创建labs仓库并初始化 mkdir labs && cd labs git init
步骤2:逐个将源仓库作为子树合并
以lab-1为例,假设它的远程地址是git@example.com:xxx/lab-1.git,将它合并到labs/lab-1目录:
# 添加源仓库为远程(命名为lab-1,方便后续操作) git remote add -f lab-1 git@example.com:xxx/lab-1.git # 将lab-1的master分支合并到本地lab-1目录,保留全部提交历史 git subtree add --prefix=lab-1 lab-1 master --squash=false
说明:
--squash=false会保留所有提交历史,若想压缩为单个提交可去掉该参数。
重复上述步骤处理lab-2和lab-3:
# 处理lab-2 git remote add -f lab-2 git@example.com:xxx/lab-2.git git subtree add --prefix=lab-2 lab-2 master --squash=false # 处理lab-3 git remote add -f lab-3 git@example.com:xxx/lab-3.git git subtree add --prefix=lab-3 lab-3 master --squash=false
步骤3:验证并推送到远程
# 查看提交历史,确认所有仓库的历史已保留 git log --oneline --graph # 关联远程labs仓库并推送 git remote add origin git@example.com:xxx/labs.git git push -u origin master
后续维护说明
- 若源仓库在失去权限前还有更新,可通过以下命令同步:
git subtree pull --prefix=lab-1 lab-1 master - 这种方式下,所有代码都在同一仓库内,克隆和日常操作与普通仓库完全一致,无需额外的子模块初始化步骤,比submodule更省心。
内容的提问来源于stack exchange,提问作者Jasmine Fan
相关产品推荐
相关产品推荐

