专门用于特定仓库的Gitolite挂钩

12

我不知道如何在非root安装的gitolite中为一个特定的仓库创建post-receive hook。

我的裸仓库包含一个网站,应该在更新时将工作目录复制到docRoot(GIT_WORK_TREE=/path/htdocs git checkout -f)。

在使用gitolite之前,我只需更新特定仓库的钩子。
Gitolite文档提到所有钩子都应该在hooks/common下,所以我不明白它是如何工作的。

钩子应该命名为什么,放在哪里,如果需要更改结构,应该如何更改?

2个回答

8

2013年7月更新:以下内容适用于gitolite V2(或“g2”),这是当时OP使用的版本(2011年11月)。

2013年8月更新,使用最新的gitolite 3.x: 现在你有了官方特定存储库钩子

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


所有位于gitolite/hooks/common中的钩子都会在由Gitolite管理的所有存储库中进行复制,详见hook propagation documentation
这意味着您的钩子脚本必须根据执行该钩子的存储库采取特定的操作。
您可以使用$GL_REPO变量(由gitolite设置并传递给其接收到的任何git命令的所有脚本)。
或者,您可以使用在gitolite服务器上注册的一些git配置,例如mirroring hook does。请参阅post-receive.mirrorpush hookOP Eyal R在评论中补充道:
但我仍然不明白它是如何完成的(我知道$GL_REPO用于确定我要更新哪个repo,但我缺少实际部分)。我创建了一个名为post-receive.test的文件,其中包含echo“test”,将其放在$HOME/gitolite/hooks/common中,运行了gl-setup,从工作站运行push-没有任何反应(没有“test”输出)
我的回答是:
钩子应出现在gitolite服务器上您的repo的hook目录中,作为链接,链接回.gitolite/common/hook。请注意,它应该在$HOME/.gitolite/common/hook而不是/gitolite中。
OP确认缺少点是问题所在。
Gitolite中挂钩传播中详细介绍了添加钩子的过程,以及它们在“使用钩子”中的用法。

谢谢,但我仍然不明白它是如何完成的(我知道$GL_REPO用于确定我正在更新哪个repo,但我缺少实际部分)。我创建了一个名为post-receive.test的文件,并使用echo“test”将其放在/gitolite/hooks/common中,我运行了gl-setup,从工作站运行了push-没有任何反应(没有“test”输出)。 - Eyal R
1
什么是“发布钩子”? - Eyal R
只需将钩子复制到本地 gitolite-admin 存储库的 hook/common 目录中即可。 - VonC
正如我在第一条评论中所写 - 我已经做了那个。文件名应该是什么?也许那就是问题所在... - Eyal R
@ChristopherPfohl 所有链接已恢复 ;) - VonC
显示剩余6条评论

4
这是一个使用gitolite的相当普遍的需求,对于不是非常高级的用户来说,这似乎有些难以解决(至少对我来说是这样)。在stackoverflow和gitolite的链接中来回跳转可能有点令人困惑。以下是我的结论和我所采取的路径,以便能够实现这一目标。正如@VonC所提到的,自版本3.5.3.1Github链接)以来,创建特定于存储库的钩子已经成为可能。 更新/升级Gitolite 您应该做的第一件事是更新您的gitolite repo。因此,请使用ssh登录到托管gitolite的服务器,并移动到安装gitolite的位置(通常为/home/git/gitolite),作为git用户(通常为git)。
例如:
$ ssh myusername@devserver.com
$ sudo su - git
$ pwd
/home/git
$ cd gitolite

然后我们需要升级gitolite。为此,首先我们需要更新gitolite存储库。

$ git pull

然后我们需要重复安装命令(确保使用与之前相同的参数)

$ ./install

最后再次运行设置。

$ gitolite setup

如果这样做不起作用,你可能没有在PATH中设置gitolite可执行文件,所以你可以像这样做:

$ src/gitolite setup

Gitolite设置(“RC”文件) 这是让我最困惑的部分之一,但最终它变得非常简单明了。
著名的“rc”文件位于git的主目录/home/git/.gitolite.rc。确保你有一个名为LOCAL_CODE的变量,在该文件中应该看到类似以下内容,如果没有,请添加。
LOCAL_CODE => "$ENV{HOME}/.gitolite/local"

在“启用命令和功能”部分,您应确保repo-specific-hooks可用,如果没有,请添加。
ENABLE => [

    # COMMANDS

        # These are the commands enabled by default
        'help',
        'desc',
        'info',
        ...,
        ...,
        ...,
        'repo-specific-hooks'
        ...,
        ...,
        ...
]

这里是文档链接

编写特定于存储库的挂钩

最后,在您的 本地 gitolite-admin 存储库中创建以下目录 hooks/repo-specific,放置在刚刚设置的 LOCAL_CODE 变量所在的目录下,例如:

gitolite_admin/local/hooks/repo-specific

之后,您可以将钩子脚本添加到该位置,并通过gitolite conf文件进行管理,如文档中所述。请确保这些脚本是可执行的。

repo foo
RW+                       =   @all
option hook.post-receive  =   deploy

希望这能对一些人有所帮助。

干杯!


那么,deploy是脚本名称。它应该放在gitolite_admin/local/hooks/repo-specific目录中的哪里?如果有多个仓库想要使用相同名称的脚本(比如说deploy),该如何区分它们?我需要更多的例子来理解你的解释。 - Nik O'Lai
我已经有一段时间没有再次设置gitolite了。我将尝试回答你的问题,希望我能做到。是的,您的脚本需要放置在目录gitolite_admin/local/hooks/repo-specific下。如果您想要针对每个repo使用不同的“deploy”脚本,则需要为每个repo创建一个部署脚本,并在每个repo的基础上设置它。例如:repo foo RW+ = @all option hook.post-receive = deploy-foo repo bar RW+ = @all option hook.post-receive = deploy-bar - RickyCheers
因此,deploy-foodeploy-bar,必须位于目录gitolite_admin/local/hooks/repo-specific中。 - RickyCheers
我已将本地代码设置为:LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local",但除此之外,这对我来说完美无缺。 - lanoxx
你的指导比原始文档更好http://gitolite.com/gitolite/non-core/#repo-specific-hooks。在推送gitolite-admin repo中的更改后,我收到警告“repo-specific-hooks:'...../local/hooks/repo-specific'不存在或不是目录。”所以我手动创建了它,然后再次尝试,但我又得到了另一个错误:“repo-specific-hooks:'...../local/hooks/repo-specific/deploy'不存在或不可执行”,因为我看到创建的符号链接foo.git/hooks/post-receive指向不存在的文件:'...../local/hooks/multi-hook-driver'。有什么想法出了什么问题? - mikep

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