git - 大家都是如何管理服务器上的文件的?
淡淡烟草味
淡淡烟草味 2017-05-02 09:27:07
0
4
502

网站里的文件成千上万,不可能每次改几十个文件就把整个网站用FTP重新上传一遍,但每次改了哪些文件,想记住也不是一件简单的事情,并且这些修改过的文件分散在很多不同的文件夹里,一个一个找出来上传更麻烦。

那么大家都是如何精确地每次都能很方便地只上传那些改动过的文件的呢?

PS. 我现在的做法是在本地开发环境上安装git, 在远端服务器上也安装git,然后这边push,那边pull。但是还需要telnet或者ssh到远端才能pull,有没有更加自动的方法,这边push之后,服务端自动就更新了?想听听大家的建议。

淡淡烟草味
淡淡烟草味

全部回复(4)
世界只因有你

感谢 @Cocbin 的提醒,据此仔细研究了Git的hook原理,然后根据我的项目做了以下事情:

首先,因为我是把项目部署在github网站上,所以不需要自己设置复杂的hook,而只要使用github自带的webhook就可以了。webhook会在你push到github时激发一个你设定的回调url,然后你在这个url里执行pull操作即可。

另外,在你的服务器上,不要使用开发者自己的ssh key来pull,而应该生成一个deploy key,放到github里面,这个key是不需要手动输入密码的,专用于从github pull内容下来,这样就彻底完成了自动部署。

我另外还看了Hudson和Jenkins,也都是很不错的工具,如果是做Java项目的话,应该是使用Jenkins,因为Hudson被Oracle收购之后,逐渐变得不再开放。但因为我的项目是php的,犯不着为了这个再装一套Java8,所以没有考虑,但其实也有专门的Jenkins for PHP,但对我来说感觉还是太重了,也许等以后项目再大一些的时候考虑使用吧。

以上就是一些心得,希望对有同样问题的同学有帮助。

---------- 这里是华丽丽的分界线 --------------------------

补充:

实际操作过程远比想象中复杂,以下是代码:

        $sReqData = file_get_contents('php://input');
        try {
            $payload = json_decode($sReqData);
        } catch (Exception $e) {
            exit(0);
        }

        if ($payload->ref === 'refs/heads/master') {
            exec('cd /var/www/your_repo; git pull;');
        }

这时候当有push上传时,github会回调,但问题是由于回调时用的是apache这个用户名,不是你ssh进去时用的那个用户名,所以你会发现apache这个用户名对于那个目录没有操作权限:
error: cannot open .git/FETCH_HEAD: Permission denied
所以你需要先把ssh_user加到apache组中:

usermod -a -G apache ssh_user

然后修改权限:

chmod -R g+w /var/www
chown -R ssh_user:apache /var/www
chmod -R g+s /var/www

之所以放在这个目录,是因为apache这个用户的缺省目录就是/var/www,当然你可以把它改到另外一个目录下,可能会更安全一些。

然后:

sudo -u apache git pull

它会在apache的.ssh文件夹下产生一个known_hosts文件,然后如果你是用的ssh方式,你还需要把上面生成的deploy key里的两个文件id_rsaid_rsa.pub拷到.ssh文件夹里去。然后反复多执行几遍以下命令,确保不再报任何错误。然后就可以尝试从客户端push一个新版本上去,看是否可以自动部署成功了。

================ 国内版 =====================

因为Github的服务器不在国内,所以经常会造成无法push/pull的麻烦,所以考虑迁移到国内的git.oschina.net上。迁移过程不细述。只是有个别地方需要注意一下:

  1. 关于webhooks的代码:

        $sReqData = $_POST['hook'];
        try {
            $payload = json_decode($sReqData);
            if ($payload->password === '这里是你的密码' && $payload->hook_name === 'push_hooks') {
                exec('cd /var/www/your_repo; git pull;');
            }
        } catch (Exception $e) {
            exit(0);
        }
  1. 关键一步要执行,我被卡在这里找不到原因很久:

sudo -u apache git pull
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!