Git Post-Receive中的权限问题

3

我已经在本地和服务器上设置了 Git,并创建了一个“post-receive”钩子,以便当我将代码推送到生产服务器时,它会自动检出到网站的虚拟主机目录。

#!/bin/sh
GIT_WORK_TREE=/var/www/domainname/public_html/ git checkout -f

然而,当我尝试进行推送时,它成功地推出了主分支,但是在尝试在我的服务器Web根目录上创建这些文件时,我遇到了权限被拒绝的错误。
例如:remote:error:unable to create file index.php(Permission denied) 由于我设置了服务器的方式,这些错误对我来说实际上是有道理的。我禁用了root访问,并创建了一个新用户,通过visudo将其添加到sudoers中 - 然后为此用户设置了SSH密钥。我使用这个用户将我的git更改推送到服务器。
问题是,我相信连接以进行推送的该用户没有写入虚拟主机目录的权限。这些文件夹中的所有文件都由www-data(我的nginx用户)拥有,具有相同的组。
解决方案是什么?创建另一个用户并使用SSH密钥进行连接,只为git提供更高的权限,或者有没有一种方法授予post-receive类似于sudo的能力?
非常抱歉问题描述得很冗长,但我想要绝对明确我所做的事情。
1个回答

0
如果您的repo是使用--shared选项创建的(请参见“更改GIT存储库为共享”),那么将允许来自同一组的用户访问和写入。
有没有办法将这些不同的用户分组到同一组中?
就像在“Git无法创建文件权限被拒绝”中提到的那样,属于同一组。
或者sudo访问,如this question的评论中所解释的那样,更改sudoers:
 git ALL = (root) NOPASSWD: /usr/local/sbin/prgetsimpleappscom 

感谢回复。但需要明确的是,我没有问题将代码推送到服务器上的仓库,问题出现在 post-receive 尝试将文件复制到 Web 根目录时。那里的文件归 www-data 所有,以便 Web 服务器可以正确地编写和运行它们,例如从管理员添加插件。 - bbish007
此外,我使用ssh来推送remote的用户没有复制和覆盖web根目录中文件的权限。我觉得我可能忽略了一些很明显的东西! - bbish007
实际上,最后一个链接中的某些内容可能已经解决了问题,我会尽快确认。git ALL =(root)NOPASSWD:/usr/local/sbin/prgetsimpleappscom - bbish007
@bbish007 好的,那么关于sudoers选项(我在编辑后的答案中详细说明了),您有什么想法? - VonC
我已经使用sudo无需密码选项,并解决了我想要实现的问题。非常感谢您对此所做的一切努力。 - bbish007
显示剩余2条评论

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