使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录
以下是使用
git subtree
将多个项目合并到一个仓库并保留提交记录的详细步骤:
步骤 1:初始化主仓库
创建一个空的 Git 仓库作为主仓库:
mkdir main-repo && cd main-repo
git init
步骤 2:逐个添加子项目
假设有 6 个子项目,每个子项目需要合并到主仓库的不同子目录中。以下以合并 子项目A 为例,其他项目重复此过程。
2.1 添加子项目远程仓库
将子项目的远程仓库添加为 remote
:
git remote add projectA https://github.com/user/projectA.git
2.2 将子项目合并到主仓库的指定目录
使用 git subtree add
将子项目的代码和历史记录合并到主仓库的 subdir/projectA
目录中:
git subtree add --prefix=subdir/projectA projectA main
--prefix=subdir/projectA
:指定子项目在主仓库中的目录路径。projectA main
:从projectA
远程仓库的main
分支合并代码。
2.3 重复操作其他子项目
对其他 5 个项目(B、C、D、E、F)重复上述步骤:
git remote add projectB https://github.com/user/projectB.git
git subtree add --prefix=subdir/projectB projectB main
git remote add projectC https://github.com/user/projectC.git
git subtree add --prefix=subdir/projectC projectC main
# 依此类推...
步骤 3:验证提交历史
合并完成后,检查主仓库的提交历史是否包含所有子项目的记录:
git log --oneline --graph --all
- 每个子项目的提交历史会显示为独立的提交树,路径前缀为
subdir/projectA/
、subdir/projectB/
等。
步骤 4(可选):后续同步子项目更新
如果子项目后续有更新,可以通过 git subtree pull
同步:
git subtree pull --prefix=subdir/projectA projectA main
目录结构示例
合并后的主仓库目录结构如下:
main-repo/
├── subdir/
│ ├── projectA/ # 子项目A的代码和历史
│ ├── projectB/ # 子项目B的代码和历史
│ ├── projectC/
│ └── ... # 其他子项目
├── .git/
└── README.md # 主仓库的文档
关键注意事项
路径冲突
- 确保不同子项目的目标路径(
--prefix
)唯一,避免文件覆盖。 - 例如,
subdir/projectA
和subdir/projectB
不应重叠。
- 确保不同子项目的目标路径(
分支选择
git subtree add
默认合并子项目的main
(或master
)分支。如需合并其他分支(如develop
),需显式指定:git subtree add --prefix=subdir/projectA projectA develop
远程仓库管理
- 添加远程仓库后,可以随时删除(不影响已合并的代码):
git remote remove projectA
- 但保留远程仓库可方便后续同步更新。
- 添加远程仓库后,可以随时删除(不影响已合并的代码):
提交历史完整性
- 使用
git subtree
合并后,子项目的提交历史会完整保留,但提交哈希会因路径前缀变化而改变。
- 使用
完整操作示例
# 初始化主仓库
mkdir main-repo && cd main-repo
git init
touch README.md
git add . && git commit -m "Initial commit"
# 添加子项目A
git remote add projectA https://github.com/user/projectA.git
git subtree add --prefix=subdir/projectA projectA main
# 添加子项目B
git remote add projectB https://github.com/user/projectB.git
git subtree add --prefix=subdir/projectB projectB main
# 重复添加其他子项目...
# 推送主仓库到远程
git remote add origin https://github.com/user/main-repo.git
git push -u origin main
总结
通过 git subtree
合并多个项目:
- 保留完整历史:每个子项目的提交历史独立且完整。
- 非侵入式:主仓库与子项目无强耦合,子项目仍可独立开发。
- 灵活同步:可随时拉取或推送子项目的更新。