我有以下设置:
两个用户:example和git
在/home/git/repositories/project.git/hooks/post-receive
内,我有一个结帐到/home/example/public_html/dev
因此,每次git推送,项目文件都会发布到http://dev.example.com
问题是,结帐是从git用户执行的,因此dev目录中的所有文件都归git:git所有,权限为600.
因此访问http://dev.example.com不会显示该页面。因为用户apache无法访问它。
有人建议在post-receive钩子里做一个chown。 那么,用户git需要是sudo。 所以我添加了用户git作为sudoer。 下一个问题是“抱歉,你必须有一个tty来运行sudo ” 所以我评论#Default requiretty,但遇到了下一个问题。
让用户git成为一个sudoer并不是我想要的(不安全)所以我把所有东西都改回了正常。
还有其他更安全的选择吗?
可能让post-receive hook在dev文件夹中触发一个php文件,这个php文件会进行结账吗?
或者我可以通过apache kan在浏览器中显示它们的方式将dev文件夹符号链接到/ home / git中的文件夹吗?
答案 0 :(得分:6)
解决。
我的收件后挂钩如下:
#!/bin/sh
echo "Deploying to http://dev.example.com"
GIT_WORK_TREE=/home/example/domains/example.com/public_html/dev git checkout -f
cd /home/example/domains/example.com/public_html/dev
find -type f -group 'git' -exec chmod 644 -R {} \;
find -type d -group 'git' -exec chmod 755 -R {} \;
只要不存在可写目录,这将有效。 否则我必须将它们作为额外的chmod行添加到钩子脚本
答案 1 :(得分:-2)
您应该始终推送到裸存储库,因此不存在权限问题。
你可以有一个更新后的钩子'ssh(公钥)'到你的DocumentRoot并做git pull。这样你的推送就可以在网络服务器上立即获得。
虽然这种技术可行,但是将内容立即提取到DocumentRoot可能不是一个好主意,我宁愿在cron中执行此操作,以便无需在不可预测的时间间隔刷新Web服务器缓存。