3

我有以下设置:

两个用户:example 和 git

在里面/home/git/repositories/project.git/hooks/post-receive我有一个结帐/home/example/public_html/dev

因此,每次 git push 都会将项目文件发布到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 钩子触发 dev 文件夹中的一个 php 文件,这个 php 文件将进行结帐?

或者我可以将 dev 文件夹符号链接到 /home/git 中的文件夹,以某种方式 apache kan 在浏览器中显示它们?

4

2 回答 2

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 行添加到钩子脚本中

于 2013-07-21T13:39:38.470 回答
-2

您应该始终推送到裸存储库,因此不存在权限问题。

你可以有一个更新后的钩子,它将'ssh(公钥)'连接到你的 DocumentRoot 并执行 git pull。这样一来,您的推送就可以立即在网络服务器上使用。

虽然这种技术会起作用,但立即将内容拉到 DocumentRoot 可能不是一个好主意,我宁愿在 cron 中执行此操作,这样网络服务器缓存就不需要以不可预测的时间间隔刷新。

于 2013-07-20T01:28:32.957 回答