如何将多Git仓库迁移至单体仓库指定目录并保留提交历史?
当然可以!完全不用依赖Lerna这类工具,用标准Git命令就能搞定,还能完整保留每个项目的提交历史。我给你一步步拆解操作流程,你跟着做就行:
步骤1:创建并初始化单体仓库
首先先创建你的单体仓库目录,然后初始化Git:
mkdir monorepo cd monorepo git init
步骤2:迁移第一个项目(project1)
假设你的project1仓库在本地的../project1路径下(如果是远程仓库的话,直接用仓库URL就行):
- 把
project1作为远程仓库添加到单体仓库中:
git remote add project1 ../project1
- 拉取
project1的所有提交历史和分支:
git fetch project1
- 创建一个临时分支,基于
project1的主分支(这里假设主分支是main,如果是master就替换成master):
git checkout -b temp-project1 project1/main
- 重写这个临时分支的历史,把所有文件移动到
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
- 切换回单体仓库的主分支,合并临时分支(因为两个仓库历史无关,需要加
--allow-unrelated-histories参数):
git checkout main git merge temp-project1 --allow-unrelated-histories
- 清理临时分支和远程仓库:
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
相关产品推荐
相关产品推荐

