gitolite_admin挂钩和镜像

时间:2013-08-25 15:21:11

标签: gitolite

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

让我们想象一下,我希望使用 gitolite_admin <对于repo awesome 进行 更新后 挂钩/ strong> 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`'

3 个答案:

答案 0 :(得分:3)

除了sitaramanswer之外,最近(2013年8月29日)commit 62fb31755a以前引入了回购特定的钩子:

  

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

虽然你不能为gitolite-admin指定钩子。
而你的钩子只是以下三个授权钩子中的一个:

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

这意味着你可以:

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

首先启用这些挂钩:

ENABLE => [

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

然后声明服务器gitolite-admin repo上的挂钩:

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

(在reponame hookname scriptname之间有一个标签或\ t)


原始答案:

gitolite man page on hooks

中所述
  

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

(否则,你将管理所有 git repos through gitolite-admin/common/hooks的钩子)

话虽这么说,你可以利用gitolite V3.x中的VREF,它们是更新钩子:这些可以设置为某些回购和某些用户,就像任何其他规则一样。
然后你可以:

  • 让你的VREF脚本在正在更新的相应裸git仓库中留下'标志'(文件)
  • 制作一个常见的'deploy'post-update挂钩,首先查找该标志,如果找到,则部署回购(并删除标记)。

再次:

  • 通过gitolite-admin管理的更新后挂钩只能与所有git回购共享(不是您想要的)
  • 只有VREF可以通过gitolite.conf
  • 与repos和用户相关联

上面的解决方案试图将这两个事实考虑在内以实现您的目标:仅为某些存储库运行的deploy脚本,并通过{{1}的gitolite.conf配置文件进行管理回复。

答案 1 :(得分:3)

您还可以查看“repo-specific environment variables

  

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

     

例如,假设您安装了一个启动CI作业的更新后挂钩。当然,默认情况下,此挂钩将对所有gitolite管理的回购都有效。但是,您只希望它运行某些特定的回购,例如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 = ""

该功能相当新近(在commit 999f9cd39中启动,但在这种情况下,在commit 63865a16 2013年6月完成3.5.2)。
但即使您没有该版本,也有其他方法可以使用选项变量来完成此操作,如该部分的最后部分所述。

  

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

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

你可以用同样的方式使用git config变量 或者您可以使用群组成员资格 - 有关详细信息,请参阅“function "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 ...

答案 2 :(得分:0)

这是一步一步的说明,以补充@ VonC的回答

gitolite hook for specific repository