4

我想知道是否有一种简单的方法可以使用 gitolite_admin 为某些 repo 安装钩子。

让我们想象一下,我想使用克隆到我的工作站的gitolite_admin repo 来获得repo的更新后钩子......

#conf/gitolite_conf
repo    awesome
        RW+     =   deployer

更新后的内容:

#!/bin/sh
echo "Post receive-hook => updating Redmine repository"
sudo -u deployer perl -we '`cd /home/deployer/repo/awesome.git && git fetch -q --all`'
4

3 回答 3

3

除了Sitaram回答之外,最近(2013 年 8 月 29 日)提交的 62fb31755a以前引入了 repo 特定的钩子:

它基本上只是创建一个<repo.git>/hooks指向内部文件的符号链接$rc{LOCAL_CODE}/hooks/repo-specific(gitolite-admin repo 除外)

你不能指定一个钩子gitolite-admin
而你的钩子只是以下三个授权钩子之一:

  • pre-receive
  • post-receive
  • post-update

这意味着您可以:

  • 将您的回购特定挂钩存储在您的gitolite-admin/hooks/repo-specific/xx
  • gitolite-admin local在服务器上的选项中声明这些。

首先启用这些钩子:

ENABLE => [

             # allow repo-specific hooks to be added
             # 'repo-specific-hooks', 

gitolite-admin然后在服务器repo上声明 hooks :

gitolite git-config gitolite-options.hook=reponame hookname scriptname

(之间有一个制表符或 \t reponame hookname scriptname


原答案:

钩子上的 gitolite 手册页中所述

如果您只想在几个特定的​​存储库中安装挂钩,请直接在服务器上进行。

(否则,您将通过 管理所有git reposgitolite-admin/common/hooks钩子)

话虽如此,您可以利用VREFgitolite V3.x 中的更新挂钩:可以为某些存储库和某些用户设置这些挂钩,就像任何其他规则一样。
然后你可以:

  • 让你的VREF脚本在适当的裸 git repo 中留下一个“标志”(一个文件)被更新
  • 制作一个通用的 ' deploy'post-update钩子,它将首先查找该标志,如果找到,则部署存储库(并删除该标志)。

再次:

  • 通过管理的更新后挂钩gitolite-admin只能对所有 git repos 通用(不是你想要的)
  • 只有 VREF 可以通过 gitolite.conf 关联到存储库和用户

上面的解决方案试图将这两个事实考虑在内以实现您正在寻找的内容:deploy仅针对某些存储库运行并通过存储库的gitolite.conf配置文件进行管理的脚本gitolite-admin

于 2013-08-25T16:35:22.920 回答
3

您还可以查看“特定于 repo 的环境变量

一种特殊形式的选项语法可用于设置特定于 repo 的环境变量,这些环境变量对 gitolite 触发器和您可能安装的任何 git 挂钩可见

例如,假设您安装了一个启动 CI 作业的更新后挂钩。当然,默认情况下,这个钩子将对所有 gitolite 管理的 repos 都有效。但是,您只希望它针对某些特定的存储库运行,例如 r1、r2 和 r4。

为此,首先将其添加到gitolite.conf

repo r1 r2 r4
    option ENV.CI = 1

这会在调用任何触发器或挂钩之前创建一个名为 GL_OPTION_CI 的环境变量,其值为 1。

注意:选项名称必须以 开头ENV.,后跟由字母、数字和下划线字符组成的字符序列。

现在运行 CI 作业的钩子可以很容易地决定要做什么:

# exit if $GL_OPTION_CI is not set
[ -z $GL_OPTION_CI ] && exit

... rest of CI job code as before ...

当然你也可以反其道而行之;即决定列出的存储库不应运行 CI 作业,但所有其他存储库应:

repo @all
    option ENV.CI = 1

repo r1 r2 r4
    option ENV.CI = ""

该功能是相当新的(从提交 999f9cd39开始,但在本例中,在3.5.2 的 2013 年 6 月提交 63865a16中完成)。
但即使你没有那个版本,也有其他方法可以使用选项变量来做到这一点,正如该部分的最后一部分所解释的那样。

在添加此功能之前,您仍然可以执行此操作,方法是使用gitolite git-config钩子代码中的命令来测试为 repo 设置的选项和配置,例如:

if gitolite git-config -q reponame gitolite-options.option-name
then
    ...

您可以以相同的方式使用 git config 变量。
或者您可以使用组成员资格——有关详细信息,请参阅针对in_group中的“ Easy.pm”功能的评论。

# in_group()

# return true if $ENV{GL_USER} is set and is in the given group

# shell equivalent
# if gitolite list-memberships $GL_USER | grep -x $GROUPNAME >/dev/null; then ...
于 2013-08-26T05:03:30.433 回答
1

以下是补充@VonC答案的分步说明

特定存储库的 gitolite 钩子

于 2014-03-15T00:13:29.057 回答