【问题标题】:How can I deploy my websites using Git hooks?如何使用 Git 挂钩部署我的网站?
【发布时间】:2012-05-09 09:39:51
【问题描述】:

我最近开始在我的日常工作流程中使用 Git,我真的很喜欢使用它。

我在我的 VPS 上名为 website.git 的文件夹下有一个裸在线 repo (git init --bare --shared),并在需要时将更改从本地推送到它,这绝对没问题。现在,当我在本地存储库中保存数据时,我会将更改推送到网上,但随后我也必须手动将文件移动到 public_html 文件夹中,正如您可以想象的那样,这真的很痛苦。

我已尝试使用http://toroid.org/ams/git-website-howto 中描述的 git 挂钩,但它的权限对我不起作用。

public_html 和 website.git 文件夹都归 www-data:developers 所有,但是当 post-receive 挂钩启动时,它无法取消链接旧文件,并且任何新文件都自动归 jack:jack 所有这是我通过 SSH 连接到服务器的用户。

我的 hooks/post-receive 文件是可执行的并且包含:

#!/bin/sh
GIT_WORK_TREE=/home/web/website.com/public_html git checkout -f

而我的在线回购存储在

/home/web/website.com/website.git

我做错了什么?

【问题讨论】:

    标签: git repository githooks


    【解决方案1】:

    这是一个基本的操作系统权限问题:当您使用ssh 推送更改时,git 使用ssh 连接到远程主机(作为您选择的某些用户 - 这就是 url 允许 ssh 的原因: //user@host/path) 以便在主机上运行命令,这些命令会拾取被推送的对象(提交、树、blob 和/或标签)并将它们插入目标 repo .不管那个用户是谁,然后也运行钩子。因此,当 post-receive 挂钩运行时,它会以该用户身份运行。

    您可以使 public_html 目录更具可写性(这样您的所有git push 用户都可以对其进行写入);您可以以用户www-data 的身份登录;或者您可以使用 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(已修复错误)中,您将不需要上述所有内容(尽管它确实在手动运行时使钩子工作,这很方便)。

    【讨论】:

    • 感谢您的信息。你是对的,这是一个权限问题!我将 public_html 文件夹设置为 777,这样所有用户都可以写入,修改文件,然后执行推送。没有错误出现,public_html 中的文件将所有者从 www-data 更改为 jack(正如您所说,因为 jack 正在运行挂钩),文件也更改为 755,当我打开其中一个更改的文件时,它还没有更新!我想知道其他人如何让这个工作......?
    • 嗯。如果您愿意让所有内容都非常可写,请尝试在添加git checkout -f 之前添加umask 0。此外,由于在 git 1.7.4 中修复了一个错误,我必须确保所有路径始终是绝对的,并且我对 $GIT_WORK_TREE; 做了一个“cd”;请参阅编辑以回答。
    【解决方案2】:

    我遇到了与您类似的权限问题,并使用another technique 进行部署,但我确实将我的 apache 更改为使用我的 git 用户。它在git 1.7.9Ubuntu 12.04.1 LTSApache/2.2.22 上为我工作。

    我的 git 用户名为 git,而我的 apache 使用的是 ubuntu 用户。我必须在 /etc/apache2/conf.d/security 上编辑 apache 配置(你也可以在 /etc/apache2/http.conf 上进行)以包括:

    User git
    Group git
    

    现在我的/var/www/myproject 部署所有推送文件,使用git:git 用户/组创建文件,我的 apache 使用相同的用户/组运行。

    您可以随时将其添加到您的 hooks/post-receive 脚本的末尾:

    chown -R www-data:developers /home/web/website.com/public_html
    

    现在您只需重新启动服务器或执行service apache2 restart

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 2013-09-19
      • 1970-01-01
      • 2012-08-08
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2014-10-30
      相关资源
      最近更新 更多