精简版
首先来个简单的PHP脚本:
<?php
pclose(popen(‘cd /var/www/wenhsing && git pull‘, ‘r‘));
这里使用popen
函数打开一个进程操作,之所以不用exec
等函数,是因为很多服务器会禁用这个函数,而且我个人习惯是使用popen
这个函数。当然,如果你的系统支持,你也可以使用你想要使用函数进行操作,如system
、shell_exec
。
然后函数的第一个参数就是我们想要执行的命令了,这里先进入我的项目根目录目录,然后执行git pull
同步Git仓库。你的目录和我的不一样,记得改,不要完完全全抄作业。
最后关闭对应的进程,这个PHP同步Git仓库的小脚本就写完了。
运行的时候,如果你发现没有同步代码到本地,不要慌,那是正常现象。我们平常运行Git命令的时候,是需要输入服务器的密码的。想要解决这个问题就是增加Git公钥到服务器上,然后你通过私钥访问服务器,拉取数据到本地,你又可以愉快的玩耍了。
密码版
很多时候,上头的人不会弄公钥,又抓着服务器管理密码不放,只提供了Git服务器的密码访问,那就只能通过输入密码的形式拉取代码了。这就有问题了,脚本要怎么输入密码?
我这里的解决方法可以参考看看:
-
稍稍改下代码,将对应的进程变成Shell脚本
<?php pclose(popen(‘/var/www/wenhsing/syncGit‘, ‘r‘));
-
新建对应的Shell脚本
syncGit
,写入以下内容#!/usr/bin/expect cd /var/www/wenhsing spawn git pull expect "password" send "mypassword\n" interact
这里使用的是
expect
命令,在需要输入的时候将我们的密码输入进去,完成我们需要输入命令的操作。记得要进行对应路径等修改,注意保留密码后面的\n
。如果你的系统没有
expect
,那么请一定记得安装它。
安全版
对于安全版这个说法,只是因为标题想要以三个字为主,安全性上可以说有,也可以说没有。主要的思路就是在PHP脚本加上一点验证,不让别人轻易的拉取最新的代码,对于仓库来说,确实可有可无,水字数,哈哈。
代码就在密码版的基础上改:
<?php
// PHP7的写法
$token = $_GET[‘token‘] ?? ‘‘;
if ($token != sha1(‘wenhsing‘)) {
exit(0);
}
pclose(popen(‘/var/www/wenhsing/syncGit‘, ‘r‘));
这样你就可以将这个脚本放到服务器可访问目录下,通过域名访问到这个文件,传上对应的参数就可以同步远程Git仓库的代码了。
如果你的远程仓库是在Github或者Gitee, 那你也可以将对应的访问路径填写到Github或者Gitee的WebHook下,当仓库有更新的时候,通过这个脚本,就可以达到自动更新代码的效果了。
如果是自建的Git服务器的话,那就自己写好服务器钩子吧,我就先去搬砖了。