通过PHP同步Git仓库

精简版

首先来个简单的PHP脚本:

<?php
pclose(popen('cd /var/www/wenhsing && git pull', 'r'));

这里使用popen函数打开一个进程操作,之所以不用exec等函数,是因为很多服务器会禁用这个函数,而且我个人习惯是使用popen这个函数。当然,如果你的系统支持,你也可以使用你想要使用函数进行操作,如systemshell_exec

然后函数的第一个参数就是我们想要执行的命令了,这里先进入我的项目根目录目录,然后执行git pull同步Git仓库。你的目录和我的不一样,记得改,不要完完全全抄作业。

最后关闭对应的进程,这个PHP同步Git仓库的小脚本就写完了。

运行的时候,如果你发现没有同步代码到本地,不要慌,那是正常现象。我们平常运行Git命令的时候,是需要输入服务器的密码的。想要解决这个问题就是增加Git公钥到服务器上,然后你通过私钥访问服务器,拉取数据到本地,你又可以愉快的玩耍了。

如果成功运行了,但还是没有同步远程仓库的内容,那么就是文件的读写权限问题了,这个时候就需要你修改权限了,或者以对应的用户运行。

密码版

很多时候,上头的人不会弄公钥,又抓着服务器管理密码不放,只提供了Git服务器的密码访问,那就只能通过输入密码的形式拉取代码了。这就有问题了,脚本要怎么输入密码?

我这里的解决方法可以参考看看:

  1. 稍稍改下代码,将对应的进程变成Shell脚本

    <?php
    pclose(popen('/var/www/wenhsing/syncGit', 'r'));
    
  2. 新建对应的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服务器的话,那就自己写好服务器钩子吧,我就先去搬砖了。

posted @ 2021-05-07 10:51  Wenhsing  阅读(258)  评论(0编辑  收藏  举报