需求:多个项目使用一个相同的工具集,这个工具集时常增加新功能,要方便各个项目同步新功能
环境:多个项目由gitlab托管,macOS 11.4
需要处理的工具集文件夹结构如下:
./src/client/tools
├── Tool.exe 工具程序
├── config.json 公用配置
├── publish.bat 发布脚本
├── resources 源码文件夹
├── temp 个人配置及运行时临时文件夹
…
1.gitlab上新建toolset空白项目 地址为:http://192.168.0.xx/group/toolset.git
2.将某个旧项目中的 工具集文件夹(我这里名为:tools) 复制到 旧项目根目录之外,按照gitllab 【Push an existing folder】步骤初始化项目:
cd 新建的目录\tools
git init
git remote add origin http://192.168.0.xx/group/toolset.git
git add .
git commit -m "Initial commit"
git push -u origin master
3.旧项目中的根目录中添加子模块,由于submodule的操作对于非程序同学来说有些复杂,所以我决定新建一个文件夹用来维护子模块相关,而工具程序保持在原路径,每个项目同步子模块后再各自重新导出工具程序, 改造后结构如下:
./src/client/tools
├── Tool.exe 工具程序
├── config.json 公用配置
├── temp 个人配置及运行时临时文件夹
./src/client/toolset
├── publish.bat 发布脚本
├── resources 源码文件夹
…
先把tools/目录下不需要的文件从版本库中删除,这部分是git的基础操作就不再赘述,然后给旧项目添加submodule(这些操作最好拉出一个分支来处理):
git submodule add http://192.168.0.xx/group/toolset.git ./src/client/toolset
git commit -m "submodule"
然后推送即可,如果新建了分支进行操作,就先合并再推送。
4.对于其他依赖工具的项目,重复步骤3即可。
5.后续开发,我们项目中的工具集是跟项目高度相关的,所以希望在父项目中直接开发。新分支的submodule 目录 是没有文件的 需要先执行 git submodule update --init
将代码拉到本地,cd ./src/client/toolset
进入到submodule根目录, 注意这里是一个指向某个commit 的引用,使用git status
会看到这样的状态:
HEAD detached at 411bbca 或者 Not currently on any branch
需要检出一个分支,在分支进行代码修改,我直接就使用默认的master分支。开发步骤:
进入到 submodule 目录
git fetch
、git checkout
,切换到最新版本的分支
修改代码、测试
git commit
、git push
, 子模块的修改就完成了
执行脚本发布工具程序, 发布 Tool.exe
再进入到原项目的目录,此时用 git status 应该可以看到src/client/toolset文件夹、Tool.exe 有变更,
提交变更
对于其他引用该子模块的项目,也按照上边的步骤,略过代码修改、commit的步骤即可。
PS:我是在原项目,新建分支上进行改造的,分支名:tool-feature; 当我在其他机器上使用githubDestop 工具checkout 分支 tool-feature时会报错:
fatal: not a git repository: …/…/…/.git/modules/src/client/toolset
fatal: could not reset submodule index
需要删除 .gitmodules、src/client/toolset,然后使用命令行切换:git checkout tool-feature
;建议不要使用工具直接使用命令行:git checkout -b tool-feature origin/tool-feature
。