之前前后端的多个项目代码都放在一个仓库,版本管理起来比较混乱,于是现在决定将各个项目的代码独立出来做单独的版本管理,下面介绍一下本次迁移所用的一些技术手段
迁出工具介绍
https://github.com/newren/git-filter-repo
安装方式
我这里使用的方式是,当然你也可以使用其他的包管理器
brew install git-filter-repo
windows系统的可以下载对应的python脚本,然后按照安装文档的说明进行操作。(windows没有预安装python,先安装python3版本)
使用git-filter的好处是会过滤掉不属于该目录的提交信息,并且会自动把remote上所有的分支checkout到本地,方便后续处理。
操作步骤
这里自己操作的时候参考git文档,具体步骤已经写的很详细了,我这里就不在赘述了。
由于这次操作了好几个仓库,每次都这样来操作难免有些麻烦,可以将上述操作的部分整合为一个shell脚本
rm -rf [dir] # dir是原仓库克隆下来后生成的文件夹名
git clone [originUrl]
cd [dir]
git filter-repo --path $1 --force
# 如果全局username和email不一致,可以顺便把这个处理一下
git config user.name "username"
git config user.email "useremail"
git remote add origin $2
git config pull.rebase false # merge 如果想用rebase的方式可以使用其他设定
git pull origin master --allow-unrelated-histories
我这里命名为command.sh,使用的时候新建一个文件夹,将这个sh文件放进去,然后根据自身系统环境执行
zsh command.sh [path] [remoteUrl]
上面的path输入原先子文件夹的目录名,remoteUrl则是子文件夹后面对应的远程仓库地址
如果有无法执行的情况,加上--force一般就可以了。
后续处理&可优化项
接下来就是选取本地的分支上传到远程,这里推荐使用source tree,可以很方便的上传多个本地分支到远程。
然后现在会有一个遗留问题,就是会多嵌套一层原目录,其实也很好理解原因,以前的.git文件在原根目录下,与子目录平级,所以我们要做的就是把嵌套的这层目录去掉,将里面的文件移到根目录,这里手动操作一下即可。(切换到每个分支都需要这样操作一次)
对应的shell命令
mv [dir]/* . && rm -r [dir]
至此,都是一些常规的git操作,也就不再多提了。
可优化项的思考
对于这种多项目和仓库方式,一开始前后端放在一起,是为了Jenkins等一些CI工具的方便处理,如果需要主仓库来管理多项目的,其实是可以采用submodule的方式的,既可以将项目做一定的隔离,主仓库也能做到管理子模块详情可以参考 这里
monorepo的使用,对于多项目要使用同一个配置项或者方法时尤其适用,之前开发的时候碰到过不同端本质上同一份配置文件因为字段名称不一样导致更新后还要处理各种兼容性问题,对心智造成很大的负担,前端可以使用pnpm配合上面说的git submodule一起使用,主仓库提供公共组件模块,子模块负责各自的业务逻辑处理,合理且高效
工作中使用的一些操作,使用脚本可以提高效率,但是shell脚本本身的逻辑处理语法比较麻烦,可以使用node.js这种前端比较熟悉的方式来做一些逻辑判断和预设置,有时间可以处理一下。