2011-03-25 68 views
7

在我的服务器上,我有两个用户,www-data(由nginx使用)和gitgit用户拥有一个包含我的网站代码的存储库,并且www-data用户拥有该存储库的副本(用作nginx的webroot)。我想成立一​​个工作流程,从而推到git的仓库引起www-data的资料库进行更新,从而更新我的网站。基于Git的网站部署工作流程

为这些存储库设置挂钩的正确方法是什么?(也考虑到这两个用户的特权和权限)?

+0

将运行服务器的用户帐户拥有所有公共内容是否真的是一个好主意?如果服务器或你的代码开发,该漏洞可能会修改持久化数据,而不是仅仅访问涂写数据库连接... – sarnold 2011-03-26 01:06:31

+0

那么我应该做的'git'拥有的公开内容,并使其可读大家?这也可以简化这个问题的权限问题...... – Chetan 2011-03-26 01:11:07

+0

如果你满足于它作为一个解决方案,那么是的,它会帮你找到一种新的方法来从'git'推送到'www-data '回购。 :)你更喜欢在服务器上有两个git仓库吗?另一种选择是设置文件的组所有权是服务器的群体之一,并允许通读组权限访问。 – sarnold 2011-03-26 01:18:30

回答

5

删除由www-data拥有的资源库,并按照建立由git拥有的仓库后收到钩上这个webpage的解决方案。

2

我最终制作了git用户拥有的公共内容,并且所有人都可以阅读。于是,我做了以下设置钩子:

假设库称为mysite

  1. 创建一个分离的工作树将作为Web根目录(如用户git

    mkdir /var/www/mysite 
    cd /path/to/repository/mysite.git 
    git config core.worktree /var/www/mysite 
    git config core.bare false 
    git config receive.denycurrentbranch ignore 
    
  2. 添加后收到钩,将更新网站,并为它

    touch hooks/post-receive 
    chmod +x hooks/post-receive 
    vim hooks/post-receive 
    
    设置正确的权限

    的后收到脚本:

    #!/bin/sh 
    git checkout -f 
    chmod -R o+rX /var/www/mysite 
    

参考:
http://www.deanoj.co.uk/programming/git/using-git-and-a-post-receive-hook-script-for-auto-deployment/


更新:这里是一个better solution

注意:这个howto的早期版本依赖于将git config变量core.worktree设置为目标目录,core.bare为false,并且receive.denycurrentbranch忽略。但不需要这些变化,如果你使用GIT_WORK_TREE(当我第一次写的HOWTO,没有工作),以及远程仓库可以保持裸露。

+0

确认为什么人们不断寻找所有这些讨厌的解决方案的人在博客,而不是正确的人的。 – Arrowmaster 2011-03-26 02:37:29

+1

@Arrowmaster:谢谢,简单越好。 – Chetan 2011-03-26 02:42:23