我有以下设置(所有这些都在一台机器上):
- Gerrit 已配置并正在运行。
- Gerrit 的 Git 存储库位于该机器上。
- 所有相关的挂载都带有选项=默认值(意味着允许执行)。
- 一个特定的 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 文档中阅读了一个片段:
Gerrit 不会在它使用的存储库中运行任何标准的 git 钩子,但它确实包含了自己的钩子机制。Gerrit 在 '$site_path'/hooks 中查找具有下列名称的可执行文件。
但我将此解释为 Gerrit 不使用 Git 挂钩来执行其功能。相反,除了 Git 钩子之外,它还提供了自己的行为。真的吗?或者 Gerrit 是否真的破坏了 Git 钩子执行机制?
因此,假设 Gerrit 破坏 Git 钩子,那么我可以实现什么来阻止推送?否定如此重要的策略执行工具的 Gerrit 设计似乎非常愚蠢。