环境
开发环境A,B,C...
仓库服务器S
目的
某一个开发环境修改代码后push到仓库S时,所有开发环境都自动pull到本地,保证最新版本。做到一处push处处更新。
方案
使用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)
系列文章
- Git hook: post-receive 多客户端中任意一个客户端Push到仓库时自动让所有客户端进行Pull操作【当前文章】
- Github webhook: 多客户端中任意一个客户端Push到Github仓库时自动让所有客户端进行Pull操作