标题是一般性的,但我有更具体的问题。我深陷权限噩梦中,试图使用Git建立一个“push-to-deploy”系统。
从本地机器,我通过SSH推送到服务器(Ubuntu 14.04)。我已将服务器设置为远程
git remote add development [email protected]:/home/dummyuser/bare/repo.git
这个裸存储库位于我们用来处理部署任务的虚拟用户
dummyuser
的主文件夹中。devuser
是我自己在开发服务器上的帐户。我在远程存储库(
post-receive
)中设置了一个development.server:/home/dummyuser/bare/repo.git/hooks/post-receive
连接,用于通过git checkout
将文件部署到同一服务器上的web服务器目录,称之为webfolder/
。该文件夹当前具有权限drwxr-xr-x dummyuser www-data webfolder/
其中
www-data
是与Apache用户关联的组。如果我有
post-receive
钩子脚本,请使用命令git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f
我得到了它无法写入
webfolder/
的错误,这是可以预测的,因为我假设脚本是以我的身份运行的(devuser
),因为我通过SSH发起了推送,并且devuser
对webfolder/
没有任何权限。但是,如果我将脚本更改为充当
dummyuser
,sudo -u dummyuser git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f
只是想看看会发生什么,我有个错误
warning: unable to access '/home/devuser/.config/git/attributes': Permission denied
有几件事我不明白:
1)既不存在“CC”,也不存在“CC”。这很好,但是如果Git需要访问一个
/home/devuser/.config/
文件夹,为什么在我设置裸repo和执行hooks时它没有抱怨?2)既然我试图充当
/home/dummyuser/.config/
,为什么Git要在.config/
中查找devuser
文件夹?为什么它不查看dummyuser
我一直在研究一个让人发疯的问题的一小部分,那就是“使用Git”已经持续了四个小时了,而我的大脑是模糊的,所以请使用小单词。
最佳答案
问题在于sudo -u dummyuser
没有设置Git期望的环境变量。如果我将HOME=/home/dummyuser
添加到post-receive
钩子,部署将按预期工作。
如果有人能提供更多关于正在发生的事情或更好的解决方案的细节,写下来作为一个答案,我会接受的。两个注意事项:dummyuser
没有登录名,因此在sudo -iu dummyuser
脚本中使用post-receive
将不起作用
手动设置HOME=/home/dummyuser
并成功执行脚本后,我发现终端的echo $HOME
返回/home/devuser
,因此不会永久更改$HOME
成功执行hook脚本后,~devuser/
或~dummyuser/
或/root/
都没有.config/
文件夹。所以。。。我还是不知道为什么吉特会挂断电话。