如何将repo1指定文件夹连同提交历史迁移至repo2?
精准迁移指定文件夹及提交历史到目标仓库的方案
以下是仅迁移repo1/src/build文件夹及其完整提交历史到repo2/src1/build的分步操作,可避免全量迁移带来的大量冲突:
步骤1:提取目标文件夹并重构路径
使用官方推荐的git filter-repo工具替代已弃用的filter-branch,从repo1中剥离目标文件夹的历史,并调整为repo2需要的路径结构:
- 克隆repo1到临时本地仓库:
git clone <repo1的远程URL> temp-repo1 cd temp-repo1 - 过滤并重构文件路径:
该命令会保留git filter-repo --path src/build --path-rename src/build:src1/buildsrc/build下的所有文件及对应提交历史,并将它们的路径重命名为src1/build,与repo2的目标路径完全匹配。
步骤2:推送处理后的历史到repo2临时分支
将处理好的临时仓库关联到repo2,并推送为独立临时分支:
- 添加repo2作为远程仓库:
git remote add repo2 <repo2的远程URL> - 推送处理后的分支到repo2的临时分支(假设repo1主分支为
main,可根据实际分支名替换):git push repo2 main:temp-migrate-branch
步骤3:在repo2中合并迁移历史
回到repo2本地仓库,完成临时分支的合并:
- 克隆repo2到本地(若已克隆则直接进入对应目录):
git clone <repo2的远程URL> local-repo2 cd local-repo2 - 拉取远程临时分支:
git fetch origin temp-migrate-branch - 合并分支(因两个分支历史无关联,需添加
--allow-unrelated-histories参数):git merge temp-migrate-branch --allow-unrelated-histories - 若repo2中已有
src1/build路径导致少量冲突,手动解决后提交:git commit -m "迁移repo1/src/build至src1/build,保留完整提交历史" - 推送合并结果到repo2主分支:
git push origin main
步骤4:清理临时资源
- 删除本地临时仓库:
cd .. && rm -rf temp-repo1 - 删除repo2上的临时分支(可选):
cd local-repo2 git push origin --delete temp-migrate-branch
注意事项
- 确保已安装
git filter-repo:部分系统默认未预装,可通过包管理器安装(如Ubuntu用sudo apt install git-filter-repo,macOS用brew install git-filter-repo)。 - 操作前建议备份repo2,避免意外数据丢失。
- 若repo1提交历史较长,
filter-repo处理可能耗时,请耐心等待。
内容的提问来源于stack exchange,提问作者Hith
相关产品推荐
相关产品推荐

