部署git项目及权限问题

部署git项目及权限问题

我在自己的服务器上使用 gitolite 托管项目,我想通过 post-receive 钩子将整个项目从 gitolite 裸存储库部署到 apache 可访问的地方。

我有下一个钩子内容

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 源路径为/var/lib/gitolite/project.git/,其所有者为gitolite:gitolite

并且有了这个权限,redmine(在 www-data 用户下工作)无法实现 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-data 可访问路径)

我应该怎么办 ?

答案1

这些是典型的权限问题。解决方案总是有点混乱,因为这意味着要对正在运行的文件系统进行更改。无论如何,您可能有以下选择:

  1. http 服务器 document_root 上所有人的权限

  2. 作为sudo接收后操作运行

  3. 根据需要更改 http 服务器 document_root 的权限,即在 post-receive 中。对于此类选项,通常使用:

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

答案2

我可以提出一个稍微不同的建议吗?不要对目录执行 git checkout,而是尝试 git archive?在您的钩子中执行以下操作:

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

请注意,您可以在 tar.umask git 配置变量中设置 umask。

根据您的描述,我不完全清楚这个钩子是以谁的身份运行的,但这种方法可能会简化事情。

相关内容