环境

开发环境A,B,C...
仓库服务器S

目的

某一个开发环境修改代码后push到仓库S时,所有开发环境都自动pull到本地,保证最新版本。做到一处push处处更新。

如果你的仓库是放在Github上托管,那么本文并不适用,下面这篇文章才是你想要的

方案

使用Git的hook(钩子)功能。在执行git的各种操作时,git会在特定的事件发生时调用特定文件夹下特定文件名的hook脚本文件,你可以用任何你喜欢的脚本语言(Python,Shell,Ruby,Go...)编写这些hook的内容以适合你的使用场景。
你可以简单的理解为Git里面的事件驱动。Git支持的事件有很多,具体请参见官方中文说明
基于我的需求要用到post-receive这个hook,当仓库接收Push请求并完成以后会调用这个hook。

hook文件的位置

/.git/hooks/

hook分客户端hook和服务端hook两种。很好理解,比如做commit的时候,想在commit之前做一些检查那么很明显这个hook应该在客户端(也就是开发机),事实上确实有这个hook叫pre-commit。本文需要post-receive这个hook则是属于服务端的,也好理解,只有服务端才知道Push何时完成了。
哪些hook是客户端的哪些是服务端的也请参见官方中文说明

具体实现

最简单的就是post-receive脚本里直接ssh到各开发环境执行pull操作即可。
记得给文件添加执行权限chmod +x post-receive
由于使用了ssh免密登录,所以要提前做好免密登录(服务器的公钥加入各开发机的.ssh/authorized_keys中)。
这个方式见仁见智只有适合自己的才是最好的。原理知道了怎么做都可以。

流程图

图中的开发机B发起push,仓库在完成push后会自动调用post-receive脚本,脚本中用ssh的方式登录到各开发环境执行pull(也包括当初发起push的B)
自动pull流程

系列文章

Last modification:May 7, 2021
If you think my article is useful to you, please feel free to appreciate