如何将嵌套的Git仓库B永久合并到仓库A并保留提交历史?
合并两个独立Git仓库(A包含原B的ext目录)的最优方案
准备工作
- 先确认两个仓库都没有未提交的改动,把A和B的本地修改都提交或暂存好,避免操作中出问题。
- 记得备份两个仓库的本地目录,以防操作失误丢失数据。
具体操作步骤
1. 修改仓库A的.gitignore规则
进入仓库A的根目录(dev),打开.gitignore文件,删除其中排除ext目录的规则(比如ext/这一行),提交这个修改:
cd /path/to/dev # 替换为你的仓库A根目录路径 git add .gitignore git commit -m "取消.gitignore对ext目录的排除"
2. 将仓库B添加为仓库A的远程仓库
在仓库A中,把仓库B的本地路径(或远程仓库URL)作为新远程仓库添加,命名为repo-b:
git remote add repo-b /path/to/ext # 替换为你的仓库B根目录路径,或远程仓库URL
3. 拉取仓库B的所有提交历史
拉取repo-b的所有分支和提交到本地:
git fetch repo-b
4. 重写仓库B的提交历史,统一文件路径前缀为ext/
仓库B的所有文件原本都在根目录,现在要放到A的ext目录下,需要用git filter-repo(官方推荐的高效历史重写工具,替代老旧的filter-branch)调整历史路径:
提示:如果没安装
git-filter-repo,可以用包管理器安装(比如brew install git-filter-repo或sudo apt install git-filter-repo)。
# 基于仓库B的主分支创建临时分支(假设B的主分支是main,按需替换) git checkout -b temp-branch repo-b/main # 重写所有提交,将所有文件移动到ext/目录下 git filter-repo --to-subdirectory-filter ext # 回到仓库A的主分支(比如main,按需替换) git checkout main
5. 合并重写后的B分支到仓库A
因为两个仓库原本是独立的,合并时需要加上--allow-unrelated-histories参数:
git merge temp-branch --allow-unrelated-histories -m "合并仓库B的提交历史,文件统一放在ext目录下"
6. 清理临时资源
合并完成后,删除临时分支和添加的远程仓库:
git branch -D temp-branch git remote remove repo-b
7. 验证合并结果
检查提交历史和文件结构,确认合并符合预期:
git log --oneline --graph # 查看合并后的完整提交历史图 ls ext/ # 确认ext目录下的文件完整 git status # 确保工作区干净无异常
内容的提问来源于stack exchange,提问作者mzi
相关产品推荐
相关产品推荐

