上下文:我正在为特定的存储库创建一个 gitolite3 挂钩,其中包含我网站的一些逻辑和 css foo。
所以本质上发生的是
下面的内容/var/www/nginx/
看起来像:
drwxrwxr-x. nginx git system_u:object_r:httpd_sys_content_t:s0 foo
.git
很特别:
drwxrwxr-x. git git system_u:object_r:httpd_sys_content_t:s0 .git
为了确保所有子目录都具有正确的访问权限,我使用了:
chown nginx:git -Rf ./webfoo
chmod g+rw -Rf ./webfoo
chown git:git -Rf ./webfoo/.git
[这只是奖励,你可以跳过这个。]
gitolite3 钩子
#!/bin/bash
cd /var/www/nginx/webfoo || exit
unset GIT_DIR
echo "where: $(pwd)"
git pull -f origin deploy-me-branch
remote: where: /var/www/nginx/webfoo
remote: From /home/gitolite/repositories/webfoo
remote: c092ee2..07274a6 master -> origin/master
remote: error: unable to unlink old '.gitignore' (Permission denied)
remote: error: unable to unlink old 'templates/fancypost.html' (Permission denied)
remote: error: unable to unlink old 'templates/layout.html' (Permission denied)
/var/log/audit/audit.log
不包含任何访问拒绝。
更新:即使本地登录也git
不起作用。所以这可能是与 SELinux/文件安全上下文无关。
为什么这不能像我预期的那样工作?
答案1
它不起作用的几个原因:
- 用户
git
应该是成员团体git
- 不要以不同的用户身份拉取/重新设置基准,这
.git/*
可能会改变所有权,尤其是在以其他用户身份登录时root
一个更优雅的解决方案是使用(作为用户)monit
监视存储库,这样我也可以重新启动以及可执行的 webapp/文件是否发生更改。git
~/repositories
nginx
uwsgi