背景
小程序项目A,B,C分别是独立仓库,都用到了功能D,功能D也是一个独立仓库,目前是用git子模块实现。功能D更新频繁,每次都需要在A,B,C里面手动更新D,可能会遗忘造成问题
期望:仓库D 有更新,A,B,C分别自动拉取D
分析
要监听仓库的一系列操作,可能会用到git的hooks,看一下项目A的 .git\hooks
客户端钩子
- pre-commit:在键入提交信息前运行
- prepare-commit-msg: 在启动提交信息编辑器之前,默认信息被创建之后运行
- commit-msg:提交输入信息之前,接收参数为输入的信息
- post-commit:整个提交过程完成后运行
- pre-rebase:运行于变基之前
- pre-push:在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用
服务器端钩子
- pre-receive:处理来自客户端的推送操作时,最先被调用
- update:
- post-receive: 收到客户端推送完成之后运行
由于小程序提版本是在本地操作,理想情况是D有更新,就自动把D也拉下来,post-receive貌似能做到,但是是服务端钩子,本地git pull没有相关钩子,退而求其次,我们每次在push 时拉取仓库D
编写hooks
在.git\hooks里面本来的hook是.sample结尾的,也就是不能运行的,我们将pre-push.sample去掉后缀,编写自动更新脚本 .git\hooks\pre-push
#!/bin/sh
echo "pulling from remote..."
unset GIT_DIR
git submodule update --remote 更新的模块 //主要是这一句
此时push操作就能拉取到D的最新代码。
.git目录是本地的,不会随着提交一起推送到远程仓库是本地的,没有办法和团队成员共享
共享git hooks
将hooks单独放到一个文件中,通过设置git hooks 默认位置实现
- 根目录新建
.githooks文件夹,将.git\hooks\pre-push复制到此文件夹下 git config core.hooksPath .githooks设置默认位置
注意
- 需要注意的是每次新克隆仓库都需要执行一下
git config core.hooksPath .githooks,我们用的子模块,每次新克隆也需要初始化一下,所以把这个两个步骤都放到package.json里面
"scripts": {
"init-submodule-githooks": "git submodule init && git submodule update && git config core.hooksPath .githooks",
"init-submodule": "git submodule init && git submodule update",
"init-githooks": "git config core.hooksPath .githooks"
},
新克隆的项目第一次需要运行一下npm run init-submodule-githooks
2.如果是mac,还需要脚本设置成可执行权限