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

如何合并多个Git仓库为单仓库子目录并保留提交历史?

合并多个Git仓库到单仓库并保留历史(子目录形式)

要把A、B、C三个仓库合并到Z仓库,且每个仓库对应Z下的子目录,同时保留完整提交历史,按以下步骤操作:

步骤1:重写每个仓库的历史,将文件迁移到对应子目录

先分别处理A、B、C仓库,把它们的所有文件(包括历史记录里的)都移动到专属子目录下:

  • 克隆或打开你的仓库A本地副本,进入目录后执行:
    git filter-repo --to-subdirectory-filter A
    
    这个命令会重写A的所有提交历史,把原来根目录的文件全部放到A/子目录下。
  • 对仓库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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:55:16