标题是一般性的,但是我还有更具体的问题。我深陷在权限之梦中,试图使用Git设置“推送部署”系统。
在本地计算机上,我通过SSH推送到服务器(Ubuntu 14.04)。我已将服务器设置为远程服务器
git remote add development devuser@development.server:/home/dummyuser/bare/repo.git
此裸存储库位于虚拟用户dummyuser
的主文件夹中,我们用来处理部署任务。 devuser
是我在开发服务器上的帐户。
我在远程存储库(post-receive
)中设置了一个development.server:/home/dummyuser/bare/repo.git/hooks/post-receive
钩子,该钩子旨在通过git checkout
将文件部署到同一服务器上的Web服务器目录,称为{{ 1}}。该文件夹当前具有权限
webfolder/
其中drwxr-xr-x dummyuser www-data webfolder/
是与Apache用户关联的组。
如果我有www-data
钩子脚本,请使用命令
post-receive
我收到了无法写入git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f
的错误,这是可以预见的,因为我假设脚本是通过我自己通过SSH发起的,而脚本webfolder/
正在以我的身份运行(devuser
, 1}}对devuser
没有任何权限。
但是,如果我将脚本更改为webfolder/
,
dummyuser
只是看看会发生什么,我有错误
sudo -u dummyuser git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f
对此我有几件事不了解:
1)warning: unable to access '/home/devuser/.config/git/attributes': Permission denied
和/home/devuser/.config/
都不存在。没关系,但是如果Git需要访问/home/dummyuser/.config/
文件夹,为什么在我设置裸仓库和以.config/
执行钩子之前它没有抱怨?
2)现在,我试图扮演devuser
的角色,为什么Git在dummyuser
中寻找~devuser/
文件夹?为什么在.config/
我一直在研究疯狂的狗屎秀中的一个小问题,它正在“使用Git”播放四个小时,我的大脑很模糊,所以请使用小词。
答案 0 :(得分:1)
问题是涉及sudo -u dummyuser
而不设置Git期望的环境变量。如果将HOME=/home/dummyuser
添加到post-receive
挂钩中,则部署将按预期进行。
如果任何人都可以提供有关正在发生的事情的更多详细信息或更好的解决方案,请将其写为答案,我会接受。几个注意事项:
dummyuser
没有登录,因此在sudo -iu dummyuser
脚本中使用post-receive
无效HOME=/home/dummyuser
并成功执行脚本后,我发现终端上的echo $HOME
返回了/home/devuser
,因此$HOME
并没有永久性的变化~devuser/
,~dummyuser/
和/root/
都没有.config/
文件夹。所以...我仍然不知道为什么Git挂在上面。答案 1 :(得分:0)
Git希望用户主目录中有一个.config
文件夹。如果$HOME
设置不正确,例如如果它指向另一个用户的家,Git将尝试访问$HOME/.config
,而不知道它实际上根本不存在。但是,由于用户(因此Git)无权访问该$HOME
,因此您会收到一条错误消息,提示Permission denied
。
要进行测试,请尝试以dummyuser
的身份运行:
[ -d /home/devuser/.config ] && echo '.config exists!'
您正在尝试测试目录/home/devuser/.config
是否存在。但是,由于您没有所需的权限,因此您获得Permission denied
,并且仍然不知道目录是否存在。
您可以使用$HOME
或-H
来代替手动设置--set-home
:
sudo -Hu dummyuser git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f