【发布时间】:2013-06-26 16:12:29
【问题描述】:
我有以下设置(所有这些都在一台机器上):
- Gerrit 已配置并正在运行。
- Gerrit 的 Git 存储库位于该计算机上。
- 所有相关挂载都带有 options=defaults(表示允许执行)。
- 特定的 git 中定义了一个“预接收”挂钩。
- 那个 git 也是一个 Gerrit 项目。
- Gerrit 是 2.4.*,Git 是 1.7.4.1
我克隆了上面 4 和 5 中提到的 repo,使用:
git clone ssh://<host>:29418/<project>.git
我创建了一个简单的更改(我只是“ls”到一个新文件并添加它然后提交):
cd <project>
ls > tmp.txt
git add tmp.txt
git commit --message="This does not work"
git push origin HEAD:refs/heads/master
而且我完全预计推送会被阻止。原因如下:
预接收钩子在这里:
..prompt..> ls -l <basestoragedir>/<project>.git/hooks
total 4
-rwxr-xr-x 1 ..user.. ..group.. 279 Jun 24 15:25 pre-receive
预接收钩子本身只是日志文件的一堆回显/转储,但有一个错误退出(应该有效地阻止每次推送):
#!/bin/bash
date >> /tmp/pre-receive.log
echo "Got to the pre-receive hook." >> /tmp/pre-receive.log
env >> /tmp/pre-receive.log
exit -1
所以日志永远不会更新。并且每次尝试对此 repo 进行更改都会成功。
有什么想法吗?
我在 Gerrit 文档中阅读了一个 sn-p:
Gerrit 不会在存储库中运行任何标准的 git 钩子 它可以使用,但它确实包含自己的钩子机制。 Gerrit 在 '$site_path'/hooks 中查找列出名称的可执行文件 下面。
但我将其解释为 Gerrit 不使用 Git 挂钩来执行其功能。相反,除了 Git 钩子之外,它还提供了自己的行为。真的吗?还是说 Gerrit 真的破坏了 Git 的钩子执行机制?
因此,假设 Gerrit 破坏 Git 钩子,那么我可以实现什么来阻止推送?否定如此重要的策略执行工具的 Gerrit 设计似乎非常愚蠢。
【问题讨论】: