我在自己的服务器上使用 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
这些是典型的权限问题。解决方案总是有点混乱,因为这意味着要对正在运行的文件系统进行更改。无论如何,您可能有以下选择:
http 服务器 document_root 上所有人的权限
作为
sudo
接收后操作运行根据需要更改 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。
根据您的描述,我不完全清楚这个钩子是以谁的身份运行的,但这种方法可能会简化事情。