如何使用Git钩子部署我的网站?

时间:2012-05-09 09:39:52

标签: git repository githooks

我最近在我的日常工作流程中开始使用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

我做错了什么?

2 个答案:

答案 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,但我从来没有真正设置过这种东西。)

<小时/> 注意:我试验了一下,在目标主机上有一个旧的(1.7.0.3)版本的git。这有一个相对路径失败的错误。为了解决这个问题,我在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.9Ubuntu 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

即可