部署git项目和权限问题

我有我自己的服务器上与gitolite托pipe的项目,我想部署整个项目从gitolite裸仓库到apache可访问的地方,通过post-receive钩子。

我有下一个钩的内容

echo "starting deploy..." WWW_ROOT="/var/www_virt.hosting/domain_name/htdocs/" GIT_WORK_TREE=$WWW_ROOT git checkout -f exec chmod -R 750 $WWW_ROOT exec chown -R www-data:www-data $WWW_ROOT echo "finished" 

挂钩不能没有任何错误信息完成。

 chmod: changing permissions of `/var/www_virt.hosting/domain_name/file_name': Operation not permitted 

意味着git没有足够的权利来实现它。

git的源代码path是/var/lib/gitolite/project.git/ ,它由gitolite:gitolite拥有gitolite:gitolite

有了这个权限redmine(在www数据用户下工作)不能实现git仓库来获取所有的变化

整个项目应该放在这里: /var/www_virt.hosting/domain_name/htdocs/ ,它由www-data:www-data

我应该做些什么改变,在git中正常工作,然后redmine与仓库?

我做了什么,是:

 # id www-data uid=33(www-data) gid=33(www-data) groups=33(www-data),119(gitolite) # id gitolite uid=110(gitolite) gid=119(gitolite) groups=119(gitolite),33(www-data) 

没有帮助。

我想没有任何问题工作Apache(查看项目),redmine读取项目(Git下)和GIT(部署到WWW数据可访问path)的源文件,

我该怎么办 ?

这些是典型的权限问题。 解决scheme总是有点肮脏,因为意味着对正在运行的文件系统进行更改。 无论如何可能的select你有:

  1. http服务器document_root上每个人的权限

  2. 作为sudo post-receive操作运行

  3. 根据需要更改http服务器document_root的权限,即。 当在收到后。 对于这样的select,通常使用:

    find $PUBLIC_WWW -type f -print0 | xargs -0 chmod 666
    find $PUBLIC_WWW -type d -print0 | xargs -0 chmod 777

我可以提出一个稍微不同的build议吗? 而不是做一个git签出的目录,试试一个git档案? 在你的钩子做:

 git archive --format=tar | (cd $WWW_ROOT; tar xf -) 

请注意,您可以在tar.umask gitconfigurationvariables中设置umask。

从你的描述来看,我并不完全清楚钩子运行的是谁,但是这种方法可能会简化一些事情。