gitolite_管理挂钩和镜像

gitolite_管理挂钩和镜像,gitolite,Gitolite,我想知道是否有一种简单的方法可以使用gitolite_admin为某些repo安装钩子 让我们想象一下,我想使用gitolite_adminrepo将post updatehook for repoawesome克隆到我的工作站上 #conf/gitolite_conf repo awesome RW+ = deployer 更新后的内容: 除年代外,最近(2013年8月29日)推出了回购特定挂钩: 它基本上只是在/hooks中创建一个符号链接,指向$rc{

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

让我们想象一下,我想使用gitolite_adminrepo将post updatehook for repoawesome克隆到我的工作站上

#conf/gitolite_conf
repo    awesome
        RW+     =   deployer
更新后的内容:

除年代外,最近(2013年8月29日)推出了回购特定挂钩:

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

但是,您不能为
gitolite admin
指定钩子。
您的钩子只是以下三个授权钩子之一:

  • 预接收
  • post-receive
  • 更新后
这意味着您可以:

  • 在您的
    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)


原始答复:

正如在报告中提到的

如果只想在少数特定存储库中安装钩子,请直接在服务器上安装

(否则,您将管理所有git回购的挂钩)

也就是说,您可以利用GitoliteV3.x中的更新挂钩:这些挂钩可以为某些回购协议和某些用户设置,就像任何其他规则一样。
然后你可以:

  • 使您的
    VREF
    脚本在正在更新的相应裸git repo中保留一个“标志”(文件)
  • 制作一个通用的“
    deploy
    post-update
    hook,它将首先查找该标志,如果找到,则部署repo(并移除该标志)
再次:

  • 通过gitolite admin管理的更新后钩子只能是所有git回购的公用钩子(不是您想要的)
  • 只有VREF可以通过gitolite.conf与回购协议和用户关联
上面的解决方案试图将这两个事实考虑在内,以实现您想要的目标:一个仅为某些repo运行的
deploy
脚本,并通过
gitolite admin
repo的
gitolite.conf
config文件进行管理。

您还可以查看“”

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

例如,假设您安装了启动CI作业的更新后挂钩。当然,默认情况下,这个钩子对于所有gitolite管理的回购都是活动的。然而,您只希望它运行于某些特定的回购协议,比如r1、r2和r4

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

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

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

现在,运行CI作业的钩子可以轻松决定要执行的操作:

当然,你也可以做相反的事情;i、 e.决定列出的回购不应运行CI作业,但所有其他回购应:


该功能相当新(于年开始,但在本例中,3.5.2于2013年6月完成)。
但即使您没有这个版本,也有其他方法可以使用选项变量来实现这一点,正如该部分最后一部分所解释的

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

您也可以用同样的方式使用git配置变量。
或者您可以使用组成员身份--有关详细信息,请参阅“”中的注释

# 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 ...

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


Gitolite中的最新提交似乎引入了repo-specific钩子:请参阅
repo r1 r2 r4
    option ENV.CI = 1
# exit if $GL_OPTION_CI is not set
[ -z $GL_OPTION_CI ] && exit

... rest of CI job code as before ...
repo @all
    option ENV.CI = 1

repo r1 r2 r4
    option ENV.CI = ""
if gitolite git-config -q reponame gitolite-options.option-name
then
    ...
# 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 ...