对项目重构时有这样一个需求,1)要把代码库某个目录下的所有代码作为一个新代码库的根目录,2)并且之前所有的代码提交记录要一并迁移到这个新的git repo。
当你尝试用 git filter-branch --subdirectory-filter YOUR_SUB_DIR -- --all
来解决问题时,会看到一个警告推荐我们使用 git filter-repo。它是一个用于重写git history的多功能小工具,用法参考filter-repo使用手册。我们的需求在这里只是它的一个小case。
下面直接列出操作步骤:
1)安装 git-filter-repo
代码语言:javascript复制brew install git-filter-repo
2)Clone 原来的Repo
代码语言:javascript复制mkdir codebase
cd codebase
git clone YOUR_GIT_REPO_URL/myProject
cd myProject
3) 拉取所有信息到本地
代码语言:javascript复制git fetch --all
git pull --all
4)执行 filter-repo 命令,让某个子目录成为新repo的根目录。
代码语言:javascript复制git filter-repo --subdirectory-filter The_SubDir_in_myProject
5) 在github/gitlab创建一个新repo,把这个repo设为这个子目录的remote目标
代码语言:javascript复制git remote add origin YOUR_NEW_REPO_GIT_URL
6) 把master的history push到新repo
代码语言:javascript复制git branch -M master
git push -uf origin maste
7)把所有branchs/tags都push上去
代码语言:javascript复制git push --all origin
这时在新的git repo里应该能看到原来项目的子目录代码的所有commits、branches、tags的信息已经被迁移过来了。
Reference: [1]: https://github.com/newren/git-filter-repo/