如何合并多个Git仓库为单仓库子目录并保留提交历史?
合并多个Git仓库到单仓库并保留历史(子目录形式)
要把A、B、C三个仓库合并到Z仓库,且每个仓库对应Z下的子目录,同时保留完整提交历史,按以下步骤操作:
步骤1:重写每个仓库的历史,将文件迁移到对应子目录
先分别处理A、B、C仓库,把它们的所有文件(包括历史记录里的)都移动到专属子目录下:
- 克隆或打开你的仓库A本地副本,进入目录后执行:
这个命令会重写A的所有提交历史,把原来根目录的文件全部放到git filter-repo --to-subdirectory-filter AA/子目录下。 - 对仓库B执行同样操作,替换子目录名:
git filter-repo --to-subdirectory-filter B - 仓库C同理:
git filter-repo --to-subdirectory-filter C
注意:
git filter-repo需要Git 2.22.0及以上版本,如果你用的版本较低,可替换为git filter-branch命令(但filter-repo更稳定安全):git filter-branch --tree-filter 'mkdir -p A && git mv -k * A 2>/dev/null || true' --tag-name-filter cat -- --all
步骤2:创建并合并到目标仓库Z
- 创建Z仓库并初始化:
mkdir Z && cd Z git init - 将处理后的A、B、C仓库作为远程仓库添加到Z:
# 替换为你处理后的A仓库本地路径 git remote add -f A ../path/to/processed-A git remote add -f B ../path/to/processed-B git remote add -f C ../path/to/processed-C - 逐个合并每个仓库的主分支(如果是其他分支,替换
main为对应分支名):
合并时如果出现冲突,手动解决后提交即可。git merge --allow-unrelated-histories A/main git merge --allow-unrelated-histories B/main git merge --allow-unrelated-histories C/main
步骤3:清理(可选)
合并完成后,可以移除添加的远程仓库:
git remote remove A git remote remove B git remote remove C
这样操作后,Z仓库就包含了A、B、C的所有提交历史,且每个仓库的文件都在对应的Z/A、Z/B、Z/C子目录下,完全符合你的需求——不是子模块引用,而是直接整合代码和历史。
内容的提问来源于stack exchange,提问作者ekkis
相关产品推荐
相关产品推荐

