最近做了一个工作,需要将一个工程中的某一文件夹迁移到新的代码库中,但是希望能够保留提交历史,经过一番折腾,最后找到了一个 git-filter-repo工具完美完成了这份工作,特此记录。

安装 git-filter-repo

因为使用了 mac,通过 brew 安装最方便: shell brew install git-filter-repo

它是一个开源工具,源代码详见: https://github.com/newren/git-filter-repo

打出新分支

在原有工程的目录下,开启一个新的分支用于这个部分迁移。比如可以从 main 分支执行如下命令: shell git checkout -b feature/JIRA-123-github-migration

筛选需要迁移的目录和文件

如果有这些文件或者目录需要迁移:

  • Lambda.sln 文件
  • Lambda.Worker.sln.DotSettings.user 文件
  • Worker 目录
  • Worker.Tests 目录

并且希望迁移到 ~/repos/NewLambda 文件夹中,那么可以通过 path指定要迁移的文件或者目录,以及通过 --target指定目录文件夹: shell git filter-repo --path Lambda.sln --path Lambda.Worker.sln.DotSettings.user --path Worker --path Worker.Tests --target ~/repos/NewLambda

检查结果

在以上命令执行完毕后,进行 ~/repos/NewLambda目录,通过 ls检查一下所有的目录都已经迁移过来,并且不带有任何其他不在迁移范围内的原项目文件。
并且可以在 ~/repos/NewLambda目录下执行 git logs --oneline来检查提交历史是否完整地迁移过去了。

推送迁移后的文件

假设希望迁移到 GitHub,通过在 GitHub 上创建出新的仓库后,按照提示,在本地 ~/repos/NewLambda目录里添加 origin,然后推送即可:

shell git push --set-upstream origin $(git branch --show-current)

创建 PR

以上。然后可以向 main 分支发起 PR,已供团队成员进行审核。
image.png