【问题标题】:How to setup post-receive-email Git hook with Gitolite如何使用 Gitolite 设置 post-receive-email Git hook
【发布时间】:2011-02-20 04:09:45
【问题描述】:

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

我所有的存储库都是手动管理的。现在,我获得了如此多的存储库以及如此多的用户和组,以至于我必须升级到一些 Git 存储库管理系统。我选了Gitolite。

但我对如何配置电子邮件通知有点茫然。

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

第一个问题是:我应该把钩子放在哪里,我应该以某种方式改变它,以便它可以与 Gitolite 一起使用?

第二个问题:

标准的post-receive-email钩子依赖于*.git/config中的三个参数:hooks.envelopesenderhooks.emailprefixhooks.mailinglist

通常,对于我在 Gitolite 下移动的每个存储库,这些参数都是不同的。实际上,对于相同的权限组(有权访问存储库、接收通知的用户,其他人),它们是相同的。

我想避免为每个存储库手动编辑config 文件。如果我能在同一个集中的地方为整个 Gitolite 配置所有内容,那就更有趣了。

那么,有什么提示吗?

【问题讨论】:

  • 值得注意的分布式post-received-email的默认位置:/usr/share/doc/git/contrib/hooks/post-receive-email

标签: git gitolite post-receive-email


【解决方案1】:

初学者可以查看doc hook

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

一般来说,所有的钩子都进入hooks/common 目录。只有用于 admin 存储库的特殊更新后挂钩进入 hooks/gitolite-admin

GitoliteV3 doc on 'mirroring' 提供了自定义挂钩的替代方案。


第二个问题:

我想避免手动编辑每个存储库的配置文件。
如果我能在同一个集中的地方为整个 Gitolite 配置所有内容,那就更有趣了。

doc gitolite.conf 很清楚:

repo 特定的 git config 命令

有时您想为某些存储库指定 git config 设置。
例如,您可能有一个自定义的 post-receive 钩子,它在发生推送时发送电子邮件,并且该钩子需要知道将电子邮件发送给谁等。

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

示例用法:如果您在 hooks/common 中放置了一个钩子,该钩子需要特定于每个 repo 的配置信息,您可以这样做:

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”(对于上面的前 3 个示例)或“git config --unset-all section.key”(对于最后一个示例)。
不支持其他形式(--addvalue_regex 等)。

注意:除非rc 文件具有正确的设置,否则这将不起作用;有关详细信息和安全信息,请参阅 gitolite rc file 中的变量 $GL_GITCONFIG_KEYS $GIT_CONFIG_KEYS(现在在 GitoliteV3 or 'g3')周围的 cmets。

【讨论】:

  • 好的,看来应该可以了。有没有一种很好的方法来集中所有存储库的钩子配置参数(hooks.envelopesenderhooks.emailprefixhooks.envelopesender)?
  • @Alexander:所有钩子都集中在hooks/common 中,位于您本地的gitolite 副本中。脚本 easy-install 会将其更新为远程 gitolite-admin 并将这些挂钩复制到每个 repos。
  • @VonC:我明白。但是 post-receive-email 钩子有自己的配置参数(位于*.git/config)。我知道现在我必须为每个存储库手动编辑 config 文件。这听起来不太有趣。我想从一个中心位置执行此操作,就像我使用存储库权限一样。
  • @Alexander: git config`` 具有三个级别的配置:全局配置(在gitadmin:~/.gitconfig 的主目录中)应该是... 'global' (如“对所有回购有效”)配置
  • @Alexander:对,这意味着您需要更改经典的电子邮件通知挂钩,以便根据 gitolite 在其自己的配置管理文件中编译的内容获取参与者列表。
【解决方案2】:

目前,这不起作用:

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,这样它就可以由有权访问每个 repo 的用户的电子邮件组成。
【解决方案3】:

这是一个快速的单行程序,用于将描述添加到您的 gitolite.conf 与 repo 同名。如果您使用这种大的 @almostall 方法和 gitolite,您需要这个,以便您对每个 repo 都有描述。这节省了我一个小时的打字时间,所以不得不分享:

先试试吧:

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

干杯!

【讨论】:

    【解决方案4】:

    gitolite cookbook 告诉如何配置钩子:

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

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

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

    确保阅读安全警告。

    2。启用存储库特定挂钩

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

    3。添加电子邮件挂钩

    把对应的 post-receive hook 可执行文件(我用 git-multimail) 在您的 gitolite-admin 存储库中作为文件 /local/hooks/repo-specific/git-multimail

    提交并推送它。

    4。配置多邮件挂钩设置

    允许通过 gitolite 配置文件添加配置键 编辑 gitolite 配置文件 ~git/.gitolite.rc 并更新以下行:

    GIT_CONFIG_KEYS => ".*"

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

    5。配置多邮件电子邮件挂钩

    这是 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
    

    我决定使用 repo 特定的钩子并将它们存储在 gitolite-admin 存储库中。或者,您可以使用全局挂钩 (/local/hooks/common) 或将它们存储在 gitolite 服务器上的其他位置,然后将 LOCAL_CODE 指向那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2014-06-02
      • 2013-07-17
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多