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

如何将myRepo1中dir1的内容迁移至myRepo2的dir2并保留提交历史

迁移仓库目录至另一个仓库子目录并保留提交历史

操作步骤:

  1. 处理源仓库,仅保留目标目录的历史并调整路径

    • 克隆源仓库到本地临时目录:
      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
      
  2. 合并处理后的内容到目标仓库

    • 切换到本地已克隆的myRepo2目录:
      cd ../myRepo2
      
    • 将临时仓库添加为本地远程:
      git remote add temp-repo ../temp-repo
      
    • 拉取临时仓库的内容,允许合并无关历史:
      git pull temp-repo <源仓库分支名> --allow-unrelated-histories
      
      (将<源仓库分支名>替换为实际分支,比如main或master)
  3. 清理与验证

    • 删除临时远程:
      git remote remove temp-repo
      
    • 查看dir2的提交历史,确认历史已保留:
      git log --oneline -- dir2
      
    • 推送修改到myRepo2的远程仓库:
      git push origin <目标仓库分支名>
      

为什么之前的方法不生效?

  • git read-tree --prefix仅能将内容导入到指定路径,但不会携带提交历史,本质只是文件层面的复制。
  • git pull默认不允许合并无关联的仓库历史,且未提前调整源目录的路径结构,直接拉取会导致内容无法对应到目标子目录。

内容的提问来源于stack exchange,提问作者saurabh umathe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:14:58