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

如何将嵌套的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:24