如何将myRepo1中dir1的内容迁移至myRepo2的dir2并保留提交历史
迁移仓库目录至另一个仓库子目录并保留提交历史
操作步骤:
处理源仓库,仅保留目标目录的历史并调整路径
- 克隆源仓库到本地临时目录:
git clone <myRepo1的远程地址> temp-repo cd temp-repo - 使用
git filter-repo重写提交历史,只保留dir1的内容,并将其统一迁移到临时的dir2路径(后续合并到目标仓库时会直接对应到目标子目录):git filter-repo --subdirectory-filter dir1 --to-subdirectory-filter dir2注:如果系统未安装
git filter-repo,可使用git filter-branch替代(但filter-repo更稳定):git filter-branch --prune-empty --tree-filter ' if [ ! -d "dir1" ]; then rm -rf ./* else mkdir -p dir2 mv dir1/* dir2/ rm -rf dir1 fi ' HEAD
- 克隆源仓库到本地临时目录:
合并处理后的内容到目标仓库
- 切换到本地已克隆的
myRepo2目录:cd ../myRepo2 - 将临时仓库添加为本地远程:
git remote add temp-repo ../temp-repo - 拉取临时仓库的内容,允许合并无关历史:
(将git pull temp-repo <源仓库分支名> --allow-unrelated-histories<源仓库分支名>替换为实际分支,比如main或master)
- 切换到本地已克隆的
清理与验证
- 删除临时远程:
git remote remove temp-repo - 查看
dir2的提交历史,确认历史已保留:git log --oneline -- dir2 - 推送修改到
myRepo2的远程仓库:git push origin <目标仓库分支名>
- 删除临时远程:
为什么之前的方法不生效?
git read-tree --prefix仅能将内容导入到指定路径,但不会携带提交历史,本质只是文件层面的复制。git pull默认不允许合并无关联的仓库历史,且未提前调整源目录的路径结构,直接拉取会导致内容无法对应到目标子目录。
内容的提问来源于stack exchange,提问作者saurabh umathe
相关产品推荐
相关产品推荐

