我想知道是否有一种使用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`'
答案 0 :(得分:3)
除了sitaram的answer之外,最近(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
这意味着你可以:
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 repos through gitolite-admin/common/hooks
的钩子)
话虽这么说,你可以利用gitolite V3.x中的VREF
,它们是更新钩子:这些可以设置为某些回购和某些用户,就像任何其他规则一样。
然后你可以:
VREF
脚本在正在更新的相应裸git仓库中留下'标志'(文件)deploy
'post-update
挂钩,首先查找该标志,如果找到,则部署回购(并删除标记)。再次:
gitolite-admin
管理的更新后挂钩只能与所有git回购共享(不是您想要的)上面的解决方案试图将这两个事实考虑在内以实现您的目标:仅为某些存储库运行的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的回答