如何合并两个GitHub仓库并保留Git历史,支持后续协同提交?
合并两个Git仓库并保留历史与子目录结构
操作步骤
1. 创建并初始化新主仓库
mkdir new-main-repo cd new-main-repo git init
2. 导入第一个仓库并调整目录结构
# 添加原Repo1为远程仓库 git remote add repo1 <Repo1的Git仓库地址> git fetch repo1 # 切换到Repo1的主分支(如果原分支是master请替换) git checkout repo1/main # 重写Repo1所有历史,将所有文件迁移到repo1子目录下 git filter-repo --to-subdirectory-filter repo1 # 切回新仓库主分支,合并Repo1的历史 git checkout main git merge --allow-unrelated-histories repo1/main
3. 导入第二个仓库并调整目录结构
# 添加原Repo2为远程仓库 git remote add repo2 <Repo2的Git仓库地址> git fetch repo2 # 切换到Repo2的主分支(如果原分支是master请替换) git checkout repo2/main # 重写Repo2所有历史,将所有文件迁移到repo2子目录下 git filter-repo --to-subdirectory-filter repo2 # 切回新仓库主分支,合并Repo2的历史 git checkout main git merge --allow-unrelated-histories repo2/main
验证与使用
- 查看完整历史:执行
git log --oneline,可以看到两个原仓库的提交记录都被保留 - 使用git blame:进入对应子目录(比如
cd repo1),执行git blame <文件名>,即可查看原仓库的提交信息 - 后续提交:在新仓库的任意分支中,修改repo1或repo2目录下的文件后,直接执行
git add --all和git commit,即可将两个目录的变更一起提交
注意事项
- 确保已安装
git-filter-repo工具,若未安装可通过系统包管理器安装(如Ubuntu:apt install git-filter-repo,Mac:brew install git-filter-repo) - 若原仓库的主分支不是
main,请替换为实际分支名(如master)
内容的提问来源于stack exchange,提问作者Ian Steffy
相关产品推荐
相关产品推荐

