在我的服务器上,我有两个用户, www-data
(由nginx使用)和git
。 git
用户拥有一个包含我的网站代码的存储库, www-data
用户拥有该存储库的副本(作为nginx的webroot)。 我想build立一个工作stream,推送到git
的存储库会导致www-data
的存储库更新,从而更新我的网站。
什么是正确的方式来设置这些存储库的挂钩(这也考虑到这两个用户的特权和权限)?
移除www-data
所拥有的资源库,并按照此网页上的解决方案在git
拥有的资源库中设置post-receive钩子。
我最终制作了git
用户拥有的公共内容,所有人都可以阅读。 然后,我做了以下设置钩子:
假设该存储库被称为mysite
:
创建一个分离的工作树,作为webroot(和用户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
添加一个后期接收挂钩,将更新网站,并设置正确的权限
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
更新:这是一个更好的解决方案 。
注意:这个howto的早期版本依赖于将git config变量core.worktree设置为目标目录,core.bare为false,并且receive.denycurrentbranch忽略。 但是,如果使用GIT_WORK_TREE(在首次编写howto时不起作用),则不需要这些更改,并且远程存储库可以保持裸露状态。