git post接收后更改所有权

git post接收后更改所有权,git,githooks,ownership,Git,Githooks,Ownership,我有以下设置: 两个用户:example和git 在/home/git/repositories/project.git/hooks/post receive内部,我有一个签出到/home/example/public\u html/dev 因此,每次git推送都会将项目文件发布到 问题是,签出是从git用户执行的,因此dev目录中的所有文件都归git:git所有,权限为600 因此,访问将不会显示页面。因为用户apache无法访问它 有人建议在门柱收钩内做一个chown。 那么,用户git必须

我有以下设置:

两个用户:example和git

/home/git/repositories/project.git/hooks/post receive
内部,我有一个签出到
/home/example/public\u html/dev

因此,每次git推送都会将项目文件发布到

问题是,签出是从git用户执行的,因此dev目录中的所有文件都归git:git所有,权限为600

因此,访问将不会显示页面。因为用户apache无法访问它

有人建议在门柱收钩内做一个chown。 那么,用户git必须是sudo。 所以我添加了用户git作为sudoer。 下一个问题是“对不起,您必须有一个tty才能运行sudo” 所以我注释掉了默认要求,但遇到了下一个问题

让用户git成为sudoer并不是我想要的(不安全),所以我把一切都改回了正常状态

还有其他更安全的选择可以尝试吗

可能让post-receive钩子触发dev文件夹中的一个php文件,这个php文件将执行签出操作


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

您应该始终推送到一个空存储库,这样就没有权限问题了

您可以有一个更新后钩子,它将“ssh(公钥)”连接到您的DocumentRoot并执行git拉取。这样,您的推送就可以立即在Web服务器上使用

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

解决了

我的帖子如下:

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

如果post-receive-hook将权限更改为644,而不更改所有权,这就足够了吗?您需要sudo来chmod任何文件,对吗?不,不是您自己的文件。酷。我在dev文件夹中也有包含mysql密码等的文件。在签出期间不会覆盖它们。因此,我的开发人员可以在不知道我的密码的情况下开发和测试这些代码。这些密码文件由用户示例拥有。因此,“chmod 644-R/home/example/public_html/dev/*”会在这些文件上产生一些错误,因为我不是所有者。我认为我的最终解决方案将是对仅由我自己拥有的文件(用户git)使用chmod命令,并保留密码文件不变,我正在推动gitolite内部的回购。Gitolite正在用户git下运行。因此,post-receive钩子也属于用户git。签出GIT_WORK_树的位置不同。文件在/home/example/public_html/dev中签出,但所有文件都由git:git而不是example:apache拥有。