我最近在我的日常工作流程中开始使用Git,我真的很喜欢使用它。
我有一个裸露的在线仓库(git init --bare --shared)坐在我的VPS下名为website.git的文件夹下,并在需要时从本地推送拉动更改,这非常正常。现在,当我在我的本地仓库上保存数据时,我会在线推送更改,但是我必须手动将文件移动到public_html文件夹中,这是您真正的痛苦。
我已尝试使用http://toroid.org/ams/git-website-howto中所述的git hook,但这是对我不起作用的权限。
public_html和website.git文件夹都归www-data:developers所有,但是当post-receive hook启动时,它无法取消链接旧文件,并且任何新文件都由jack:jack自动拥有这是我通过SSH连接到服务器的用户。
我的钩子/接收后文件是可执行的,包含:
#!/bin/sh
GIT_WORK_TREE=/home/web/website.com/public_html git checkout -f
我的在线仓库存储在
中/home/web/website.com/website.git
我做错了什么?
答案 0 :(得分:1)
这是一个基本的操作系统权限问题:当您使用ssh
推送更改时,git使用ssh
连接到远程主机(因为您选择的某个用户 - 这就是为什么url允许ssh:// user @ host / path)以便在主机上运行命令,以获取被推送的对象(提交,树,blob和/或标签)并插入它们进入目标回购。那个用户是谁,然后也运行钩子。所以当post-receive hook运行时,它就像那个用户一样运行。
您可以使public_html目录更具可写性(以便所有git push
个用户都可以写入);你可以用用户www-data
ssh;或者您可以使用set-uid程序使git checkout -f
作为www-data用户运行,具有任何set-uid程序的所有常见危险。 (sudo
命令可以用于最后一种技术。我想,你会想要sudo -n -u www-data
,但我从来没有真正设置过这种东西。)
hooks/post-receive
中得到了这些内容(请注意,这是非常原始的,因为它不会检查推送到的内容):
#! /bin/sh
umask 0 # let everyone have write permission on everything
export GIT_DIR=$(readlink -f $(git rev-parse --git-dir))
export GIT_WORK_TREE=$(readlink -f /tmp/t)
(cd $GIT_WORK_TREE && git checkout -f)
在一个较新的git中(修复了bug)你不需要以上所有(虽然它确实可以在手动运行时使钩子工作,这很方便)。
答案 1 :(得分:0)
我有类似于您的权限问题并使用another technique进行部署,但我确实更改了我的apache以使用我的git用户。它适用于我git 1.7.9
和Ubuntu 12.04.1 LTS
Apache/2.2.22
。
我的git用户名为git
,我的apache使用ubuntu
用户。我必须在/etc/apache2/conf.d/security
上编辑apache配置(您也可以在/etc/apache2/http.conf
上执行此操作)以包含:
User git
Group git
现在我的/var/www/myproject
部署了push上的所有文件,使用git:git
用户/组创建文件,我的apache使用相同的用户/组来运行。
您始终可以将此添加到您hooks/post-receive
脚本的末尾:
chown -R www-data:developers /home/web/website.com/public_html
现在您只需重新启动服务器或执行service apache2 restart