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

如何将多Git仓库迁移至单体仓库指定目录并保留提交历史?

当然可以!完全不用依赖Lerna这类工具,用标准Git命令就能搞定,还能完整保留每个项目的提交历史。我给你一步步拆解操作流程,你跟着做就行:

步骤1:创建并初始化单体仓库

首先先创建你的单体仓库目录,然后初始化Git:

mkdir monorepo
cd monorepo
git init
步骤2:迁移第一个项目(project1)

假设你的project1仓库在本地的../project1路径下(如果是远程仓库的话,直接用仓库URL就行):

  1. 把project1作为远程仓库添加到单体仓库中:
git remote add project1 ../project1
  1. 拉取project1的所有提交历史和分支:
git fetch project1
  1. 创建一个临时分支,基于project1的主分支(这里假设主分支是main,如果是master就替换成master):
git checkout -b temp-project1 project1/main
  1. 重写这个临时分支的历史,把所有文件移动到projects/project1目录下(这一步是核心,确保所有历史提交的文件路径都对应到新的子目录):

注意:Git 2.22.0及以上版本推荐使用git filter-repo(官方替代了老旧的git filter-branch),如果你的Git版本较低,可以用下面的filter-branch命令替代。

用git filter-repo的命令:

git filter-repo --to-subdirectory-filter projects/project1

如果没有filter-repo,用git filter-branch(兼容旧版本):

git filter-branch --tree-filter 'mkdir -p projects/project1 && git ls-files -z | xargs -0 mv -t projects/project1' -- --all
  1. 切换回单体仓库的主分支,合并临时分支(因为两个仓库历史无关,需要加--allow-unrelated-histories参数):
git checkout main
git merge temp-project1 --allow-unrelated-histories
  1. 清理临时分支和远程仓库:
git branch -D temp-project1
git remote remove project1
步骤3:迁移第二个项目(project2)

完全重复步骤2的操作,只需要把所有project1相关的名称替换成project2即可:

# 添加远程仓库
git remote add project2 ../project2
# 拉取历史
git fetch project2
# 创建临时分支
git checkout -b temp-project2 project2/main
# 重写历史到projects/project2
git filter-repo --to-subdirectory-filter projects/project2
# 切回主分支合并
git checkout main
git merge temp-project2 --allow-unrelated-histories
# 清理
git branch -D temp-project2
git remote remove project2
验证迁移结果

迁移完成后,你可以用以下命令确认历史是否完整保留:

  • 查看project1的所有提交历史:
git log --oneline -- projects/project1
  • 查看某个具体提交的变更内容:
git show <commit-hash>

你会看到所有历史提交的文件路径都已经对应到projects/project1或projects/project2目录下了。

内容的提问来源于stack exchange,提问作者Joe Attardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:30