在 git 的 post-receive 后更改所有权

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 hook 中执行 chown。好吧,那么用户 git 需要使用 sudo。所以我将用户 git 添加为 sudoer。下一个问题是“抱歉,您必须拥有 tty 才能运行 sudo”。所以我注释掉 #Default requiretty,但遇到了下一个问题。
使用户 git 成为 sudoer 不是我想要的(不安全),所以我将所有内容都改回正常状态。
是否有其他更安全的选项可尝试?
也许可以让post-receive钩子触发dev文件夹内的一个php文件,这个php文件将执行checkout操作?
或者我能够将dev文件夹链接到/home/git内的一个文件夹中,以一种apache可以在浏览器中显示它们的方式?

如果post-receive钩子只更改权限为644,而不更改所有权,是否足够? - Slaven Rezic
你需要使用sudo才能对任何文件进行chmod操作,对吧? - user1755868
不,不是你自己的文件。 - Slaven Rezic
很好。 我有一些文件,其中包含mysql密码等信息,它们位于dev文件夹中。 在检出期间,它们不会被覆盖。 因此,我的开发人员可以开发和测试他们的代码,而不必知道我的密码。 这些密码文件的所有者是用户example。 因此,“chmod 644 -R /home/example/public_html/dev/*”将在这些文件上产生一些错误,因为我不是所有者。 我认为我的最终解决方案将是对仅由自己(用户git)拥有的文件进行chmod命令,并保留密码文件不变。 - user1755868
2个回答

7

已解决。

我的 post-receive hook 如下:

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

-2

你应该总是推送到一个裸仓库,这样就没有权限问题了。

你可以有一个 post-update 钩子,它会 'ssh (公钥)' 到你的 DocumentRoot 并执行 git pull。这样,你的推送就可以立即在 web 服务器上使用。

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


1
我正在向gitolite中的repo进行推送。 Gitolite在git用户下运行。 因此,post-receive钩子也归git用户所有。 checkout GIT_WORK_TREE具有不同的位置。 文件被检出到/home/example/public_html/dev中,但所有文件的所有者都是git:git,而不是example:apache。 - user1755868

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接