如何使用Gitolite设置post-receive-email Git hook

16

我正在使用Git发行版中的post-receive-email hook来在Git仓库更新时向某些用户发送电子邮件(hook从post-receive调用)。

我以前手动管理所有仓库。现在,我有了很多仓库和很多用户和组,所以我必须升级到一些Git仓库管理系统。我选择了Gitolite。

但是我对如何配置电子邮件通知感到有些困惑。

更新:我会详细说明问题:

第一个问题是:我应该把hook放在哪里,是否应该更改它,以便它能够与Gitolite一起工作?

第二个问题:

标准的post-receive-email hook取决于*.git/config中的三个参数:hooks.envelopesenderhooks.emailprefixhooks.mailinglist

这些参数通常对于我移动到Gitolite下的每个仓库都不同。实际上,它们对于相同的权限组——具有访问仓库权限的用户会收到通知,其他人——则不会相同。

我想避免手动编辑每个仓库的config文件。如果我可以在整个Gitolite的同一集中位置配置所有内容,那将更有趣。

所以,有什么提示吗?


1
值得注意的是,分发的 post-received-email 的默认位置是 /usr/share/doc/git/contrib/hooks/post-receive-email - Pierre de LESPINAY
4个回答

18

您可以先查看doc hook

我(管理员)应该把钩子放在哪里?

通常,所有的钩子都放在hooks/common目录中。只有特殊的用于admin仓库的提交后钩子才会放在hooks/gitolite-admin中。

但是GitoliteV3 doc on 'mirroring'提供了一种替代自定义钩子的方法。


对于第二个问题:

我希望避免手动编辑每个存储库的配置文件。
如果我可以在同一个集中的地方为整个Gitolite配置所有内容,那将会更加有趣。

doc gitolite.conf非常清晰:

特定于存储库的git配置命令

有时您想为一些存储库指定git config设置。
例如,您可能有一个自定义的post-receive钩子,在推送发生时发送电子邮件,而此钩子需要知道要发送电子邮件的人等信息。

您可以通过在“repo”段落内指定类似于以下内容来设置git config值:

示例用法:如果您在hooks/common中放置了一个钩子,该钩子需要特定于每个存储库的配置信息,则可以执行此操作:

repo gitolite
    config hooks.mailinglist = gitolite-commits@example.tld
    config hooks.emailprefix = "[gitolite] "
    config foo.bar = ""
    config foo.baz =

语法很简单:
config sectionname.keyname = [optional value_string]

这将执行一个简单的 "git config section.key value"(适用于前三个示例)或 "git config --unset-all section.key"(适用于最后一个示例)。其他形式(如--addvalue_regex等)不受支持。 注意:除非rc文件具有正确的设置,否则此操作将无效;请参阅gitolite rc file中关于变量$GL_GITCONFIG_KEYS $GIT_CONFIG_KEYS(现在在GitoliteV3或'g3'中)的注释,了解详细信息和安全信息。

好的,看起来应该可以工作。是否有一种好的方式来集中管理所有存储库 (hooks.envelopesender, hooks.emailprefix, hooks.envelopesender) 的钩子配置参数? - Alexander Gladysh
@VonC:我理解这一点。但是post-receive-email钩子有自己的配置参数(存储在*.git/config中)。我现在明白了,我必须手动编辑每个仓库的config文件。这听起来不太好玩。我希望能够像处理仓库权限一样,在一个中心位置完成这个操作。 - Alexander Gladysh
1
@Alexander: git config有三个级别的配置:全局配置(在gitadmin的主目录中:~/.gitconfig)应该是一个自然的位置,用于... 'global'(即对所有仓库有效)的配置。 - VonC
@VonC:不,那样行不通:显然,这些参数对于每个 gitolite 访问组都是不同的——邮件通知仅发送给参与者。 - Alexander Gladysh
1
@Alexander:没错,这意味着你需要更改经典的电子邮件通知钩子,以便根据gitolite在其自己的配置管理文件中编译的参与者列表来获取。 - VonC
显示剩余4条评论

6

目前,这个不起作用:

repo @all
    config foo.bar = "baz"

我想你希望它能够正常工作,但由于其他压力和有替代方法的事实,这件事现在不是我的首要任务。

@almostall = repo1 repo2 repo3
@almostall = repo4 repo5 repo6 [add as many more as you like]

[... later ...]
repo @almostall
    config foo.bar = "baz"

希望这能有所帮助,对于@all的疏忽表示抱歉。

是的,那将很酷,也会让我的配置更漂亮。但这并不能解决我所有的问题,因为我希望能够自动配置hooks.mailinglist,使其由具有对每个仓库访问权限的用户的电子邮件组成。 - Alexander Gladysh

1

这里有一个快速的一行代码,可以在gitolite.conf中添加与仓库相同名称的描述。如果您正在使用@almostall方法和gitolite,则需要此功能,以便为每个仓库提供描述。这节省了我一个小时的打字时间,所以必须分享:

首先尝试:

sed 's/^\(repo *\)\(.*\)/\1\2\n\t\t\2 = "\2"/' gitolite.conf

然后尝试原地编辑,但仍需先备份:

cp gitolite.conf gitolite.conf.backup

然后进行原地编辑:

sed -i 's/^\(repo *\)\(.*\)/\1\2\n\t\t\2 = "\2"/' gitolite.conf

干杯!


1

gitolite cookbook介绍了如何配置钩子:

1. 在gitolite中启用本地非核心程序

编辑gitolite配置文件(通常是~git/.gitolite.rc),取消以下行的注释:

LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local"

一定要阅读安全警告。

2. 启用特定于存储库的钩子

在gitolite配置文件中取消repo-specific-hooks行的注释。

3. 添加电子邮件钩子

将相应的post-receive钩子可执行文件(我使用git-multimail)放在您的gitolite-admin存储库中,作为文件/local/hooks/repo-specific/git-multimail

提交并推送它。

4. 配置multimail钩子的设置

为了允许通过gitolite配置文件添加配置密钥,请编辑gitolite配置文件~git/.gitolite.rc并更新以下行:

GIT_CONFIG_KEYS => ".*"

请确保阅读安全警告。您可能希望将其缩小到GIT_CONFIG_KEYS => "multimailhook\..*"

5. 配置multimail邮件挂钩

这是gitolite-admin存储库中gitolite.conf文件的示例配置:

repo @all
    config multimailhook.environment      = gitolite
    config multimailhook.from             = git@gitserver.com
    config multimailhook.mailinglist      = your@email.com

repo xyz
    option hook.post-receive = git-multimail

我决定使用特定于仓库的挂钩并将它们存储在gitolite-admin仓库中。或者,您可以使用全局挂钩(/local/hooks/common)或将其存储在gitolite服务器的其他地方,并指向LOCAL_CODE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接