最近做了一个工作,需要将一个工程中的某一文件夹迁移到新的代码库中,但是希望能够保留提交历史,经过一番折腾,最后找到了一个 <font style=color:rgb(31, 35, 40);>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,已供团队成员进行审核。