git子模块自动更新

451 阅读2分钟

背景

小程序项目A,B,C分别是独立仓库,都用到了功能D,功能D也是一个独立仓库,目前是用git子模块实现。功能D更新频繁,每次都需要在A,B,C里面手动更新D,可能会遗忘造成问题

期望:仓库D 有更新,A,B,C分别自动拉取D

分析

要监听仓库的一系列操作,可能会用到git的hooks,看一下项目A的 .git\hooks

企业微信截图_16890640025881.png

客户端钩子

  1. pre-commit:在键入提交信息前运行
  2. prepare-commit-msg: 在启动提交信息编辑器之前,默认信息被创建之后运行
  3. commit-msg:提交输入信息之前,接收参数为输入的信息
  4. post-commit:整个提交过程完成后运行
  5. pre-rebase:运行于变基之前
  6. pre-push:在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用

服务器端钩子

  1. pre-receive:处理来自客户端的推送操作时,最先被调用
  2. update:
  3. post-receive: 收到客户端推送完成之后运行

更多git hooks相关介绍

由于小程序提版本是在本地操作,理想情况是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 默认位置实现

  1. 根目录新建.githooks文件夹,将.git\hooks\pre-push复制到此文件夹下
  2. git config core.hooksPath .githooks设置默认位置

更多资料

注意

  1. 需要注意的是每次新克隆仓库都需要执行一下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,还需要脚本设置成可执行权限