问题 用于特定存储库的gitolite hook


我不明白如何为a创建一个post-receive hook 具体 gitolite中的存储库(非root安装)

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

在gitolite之前,我只是更新特定存储库的钩子。
Gitolite文件提到所有钩子应该在 hooks/common 所以我不明白它是如何工作的。

什么应该是钩子的名称,应该在哪里定位以及如何更改它的结构(如果它应该)?


1007
2017-11-30 08:11


起源



答案:


2013年7月更新:接下来是gitolite V2(或'g2'),这是OP当时(2011年11月)使用的版本。

使用最新的gitolite 3.x更新2013年8月: 你现在有 官方具体回购挂钩

它基本上只是在创建一个符号链接 <repo.git>/hooks 指向里面的一些文件 $rc{LOCAL_CODE}/hooks/repo-specific (除了 gitolite-admin 回购)


所有挂钩 gitolite/hooks/common 在Gitolite管理的所有存储库中都会复制,详情请参阅 钩子传播文档
这意味着你的钩子脚本必须采取特定的动作,具体取决于执行所述钩子的repo。

你可以使用 $GL_REPO 变量(gitolite设置并传递给它接收的任何git命令的所有脚本)。

或者你可以使用在gitolite服务器上注册的一些git配置,比如 镜像挂钩。见 post-receive.mirrorpush 钩

OP Eyal R. 在评论中添加:

但我仍然不明白它是如何完成的(我理解这一点 $GL_REPO 用于确定我正在更新哪个回购但我缺少实际部分)。
  我创建了一个名为的文件 post-receive.test 同 echo "test", 把它放进去 $HOME/gitolite/hooks/common,跑了 gl-setup,从工作站推出 - 没有任何反应(没有“test“输出)

我回答说:

钩子应该出现在 hook 您在gitolite服务器上的repo目录作为链接,链接回到 .gitolite/common/hook。请注意,它应该在 $HOME/.gitolite/common/hook不是 /gitolite

OP确认缺少点是问题。

添加钩子的过程详见 钩子在gitolite中传播,以及它们在“使用钩子”。


8
2017-11-30 09:15



谢谢,但我仍然不明白它是如何完成的(我知道$ GL_REPO用于确定我正在更新哪个repo但我错过了实际部分)。我用echo“test”创建了一个名为post-receive.test的文件,把它放在/ gitolite / hooks / common中,我运行gl-setup,从工作站运行push - 没有任何反应(没有“test”输出) - Eyal R
当您在本地发布钩子时 gitolite-admin 回购,然后推动 gitolite-admin 回到gitolite服务器, 然后 gitolite在所有回购中传播所有钩子。你有没有为你的脚本设置chmod 775? - VonC
你是什​​么意思“发布一个钩子” - Eyal R
只需复制钩子 hook/common 你当地的目录 gitolite-admin 回购。 - VonC
它没有提交它。它不在工作目录中。 - Eyal R


答案:


2013年7月更新:接下来是gitolite V2(或'g2'),这是OP当时(2011年11月)使用的版本。

使用最新的gitolite 3.x更新2013年8月: 你现在有 官方具体回购挂钩

它基本上只是在创建一个符号链接 <repo.git>/hooks 指向里面的一些文件 $rc{LOCAL_CODE}/hooks/repo-specific (除了 gitolite-admin 回购)


所有挂钩 gitolite/hooks/common 在Gitolite管理的所有存储库中都会复制,详情请参阅 钩子传播文档
这意味着你的钩子脚本必须采取特定的动作,具体取决于执行所述钩子的repo。

你可以使用 $GL_REPO 变量(gitolite设置并传递给它接收的任何git命令的所有脚本)。

或者你可以使用在gitolite服务器上注册的一些git配置,比如 镜像挂钩。见 post-receive.mirrorpush 钩

OP Eyal R. 在评论中添加:

但我仍然不明白它是如何完成的(我理解这一点 $GL_REPO 用于确定我正在更新哪个回购但我缺少实际部分)。
  我创建了一个名为的文件 post-receive.test 同 echo "test", 把它放进去 $HOME/gitolite/hooks/common,跑了 gl-setup,从工作站推出 - 没有任何反应(没有“test“输出)

我回答说:

钩子应该出现在 hook 您在gitolite服务器上的repo目录作为链接,链接回到 .gitolite/common/hook。请注意,它应该在 $HOME/.gitolite/common/hook不是 /gitolite

OP确认缺少点是问题。

添加钩子的过程详见 钩子在gitolite中传播,以及它们在“使用钩子”。


8
2017-11-30 09:15



谢谢,但我仍然不明白它是如何完成的(我知道$ GL_REPO用于确定我正在更新哪个repo但我错过了实际部分)。我用echo“test”创建了一个名为post-receive.test的文件,把它放在/ gitolite / hooks / common中,我运行gl-setup,从工作站运行push - 没有任何反应(没有“test”输出) - Eyal R
当您在本地发布钩子时 gitolite-admin 回购,然后推动 gitolite-admin 回到gitolite服务器, 然后 gitolite在所有回购中传播所有钩子。你有没有为你的脚本设置chmod 775? - VonC
你是什​​么意思“发布一个钩子” - Eyal R
只需复制钩子 hook/common 你当地的目录 gitolite-admin 回购。 - VonC
它没有提交它。它不在工作目录中。 - Eyal R


对于使用gitolite的人来说,这是一个相当普遍的需求,并且当不是一个非常高级的用户时(看起来对我而言),看起来有点困难。

堆栈溢出和gitolite之间来回链接可能会有点混乱。这些是我的结论和我为实现这一目标所遵循的道路。

由于@VonC提到创建特定于存储库的钩子已经可以了 版本3.5.3.1 (github链接

更新/升级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命令(确保使用与以前相同的参数)

$ ./install

最后再次运行安装程序。

$ gitolite setup

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

$ src / gitolite设置

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 repository创建以下目录 hooks/repo-specific 在您刚刚设置的目录下 LOCAL_CODE 变量,例如:

gitolite_admin/local/hooks/repo-specific

之后,您实际上可以将钩子脚本添加到该位置,并通过gitolite conf文件管理它们 在文件中说明。确保脚本是可执行的。

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

再说一遍,我希望这能帮助你们中的一些人。

干杯!


3
2018-03-15 00:09



所以, deploy 是脚本名称。应该放在哪里 gitolite_admin/local/hooks/repo-specific 目录?如果几个repos想要一个具有相同名称的脚本会怎么样(比如说 deploy),如何区分它们?我需要更多的例子来理解你的解释 - Nik O'Lai
已经有一段时间了,因为我还没有再次设置gitolite。我打算回答你的问题,希望我这样做。是的,您的脚本需要放在目录下 gitolite_admin/local/hooks/repo-specific。如果你想使用不同的 deploy 每个repo的脚本,你将不得不为每个repo创建一个部署脚本,并在每个repo的基础上设置它。例如repo foo RW + = @all选项hook.post-receive = deploy-foo repo bar RW + = @all option hook.post-receive = deploy-bar - RickyCheers
所以, deploy-foo, deploy-bar,必须在目录中 gitolite_admin/local/hooks/repo-specific - RickyCheers
我已将本地代码设置为: LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local", 但除此之外,这对我来说非常合适。 - lanoxx
你的指示比原始文档更好 gitolite.com/gitolite/non-core/#repo-specific-hooks。在推出gitolite-admin repo的变化之后,我收到了警告 repo-specific-hooks: '..../local/hooks/repo-specific' does not exist or is not a directory. 所以我手动创建它并再次尝试,我又得到了一个错误: repo-specific-hooks: '..../local/hooks/repo-specific/deploy' doesn't exist or is not executable 因为我看到创建的符号链接foo.git / hooks / post-receive指向不存在的文件:.... / local / hooks / multi-hook-driver任何想法都错了? - mikep