繁体   English   中英

Git:带有 PHP_CodeSniffer 的预接收挂钩

[英]Git: pre-receive hook with PHP_CodeSniffer

自从从 SVN 切换到 Git 后,我们失去了通过 subversion 服务器上的pre-commit hook 来执行我们的编码标准的能力。

使用 Git,您只有客户端上的预提交挂钩,无法以任何方式强制执行 更糟糕的是,我们让开发人员使用所有三个主要操作系统,因此在 Linux 或 OS X 上工作的预提交挂钩不会自动在 Windows 上工作。

go 的方法是在服务器上实现一个pre-receive挂钩,但解决方案并不像看起来那么简单:

想象一下,开发人员做了 20 次提交并想要推送它们。 我所知道的所有 pre-commit 和 pre-receive 钩子 ( 1 , 2 ) 只是检查单个提交,这最终会失败并阻止推送。 现在开发人员修复了问题并再次提交,并尝试再次推送。 由于钩子检查单个提交,它会再次失败。

所以我们需要一个pre-receive钩子来生成所有提交中所有更改文件的列表,这些文件将被推送并仅在当前 state 上运行 phpcs。

这样的钩子脚本是否已经存在? 在哪里?

编辑:似乎有一个脚本可以创建该文件列表- 不幸的是在 Python 中,但可以移植。 我仍然对使用 PHPCS 的预制解决方案感兴趣:)

我宁愿不等待服务器端挂钩来控制推送。

您可以设置一个中间存储库,它会非常定期地获取每个开发人员的分支并审核每个新提交,如果提交未能满足某些预定义的标准,则发送 email。

您也可以在中央存储库上设置预接收挂钩,但至少开发人员会更快地意识到潜在问题。

我不喜欢“git-anese”,但在 Mercurial 中有一个名为“changegroup”的钩子选项,它基本上检查一组传入提交的“顶部”提交。 也许社区中的某个人可以告诉您是否有等价物。 git 的“更改组”?

https://www.mercurial-scm.org/wiki/Hook#The_changegroup_hook

我不认为这里有技术解决方案,但如果你真的想打扰别人,那么将phpcs集成到你的 CI 设置中,并开始在你的问题管理器中为它打开票证。 ;-)

我不认为这是最好的主意,因为它真的不是技术问题。 你的问题不是提交前或提交后的钩子,而是人们不这样做,你认为你必须强迫他们。

总而言之,我理解编码标准的重要性,并且我也执行它,但它有一个社会成分(或方面)。

听起来和你一起工作的人要么不知道更好(还),要么不愿意学习。 因此,如果他们不知道更好,您必须与他们合作并教他们遵守您的要求。 这包括教他们为什么约定很重要,最后他们需要明白,只有一切都变绿了,才能完成一项功能。

也许这需要项目管理(我猜是你)将一个问题分解为多个任务,直到他们得到它:

  • 功能本身
  • phpcs
  • 文件
  • 单元测试

(没有特定的顺序。;-))

如果他们不愿意学习,你总是可以采取更严厉的措施。 就像,我会慢慢开始,每周进行一次绩效评估(一对一的情况),并重申他们为什么不这样做。 如果这没有帮助——我想你明白我的意思了。

在 Drupal 项目中,我们最近迁移到 Git 并正在研究类似的问题。 在我们的例子中,我们不希望任何人签入模块的 LICENSE.txt 文件,因为我们的打包脚本会自动执行此操作。 经过一番反复,我们想出了一个接收钩子,它不会拒绝错误的提交,但是每次它检测到错误的提交(对于“错误”的某些定义)时,它都会自动在我们的错误中记录一个关键错误跟踪器。 这样,代码仍然被提交,但是模块维护者和相应的网站管理员团队都会立即收到通知,指出有问题需要修复。 您可以轻松发送 email 或发送推文或任何其他您想要的通知。

实际上我们还没有完全实施,但这是我们的 Git 实施团队有时间时正在制定的计划。 :-)

基本上,对于你描述的问题,除了改写它之外,没有好的解决方案; 而不是“阻止可检测的违规行为”,而是“报告可检测的违规行为”。 我认为这是你能做的最好的。

使用 jenkins + gerrit:

http://alblue.bandlem.com/2011/02/gerrit-git-review-with-jenkins-ci.html

如果您的构建失败,推送将被拒绝。

http://source.android.com/source/life-of-a-patch.html

泰瑞尔

也许这个问题的答案有帮助? Git预收挂钩

我使用了这个钩子: http://criticallog.thornet.net/2011/06/02/running-php-linter-before-pushing-changes-to-a-git-repository/

并将其修改为还使用 phpcs 测试代码。

可能包含一些错误,我已经硬编码 drupal 代码标准,但它可以工作! http://pastebin.com/fEmN519B

我们现在确实使用了预提交钩子来检查代码和提交消息。

开发人员可以使用-n跳过它们,但他们很少这样做,而且我们总是有另一个开发人员在做 QA,所以事情会引起注意。

钩子很重要,因为它会注意到文件何时损坏,因此损坏的 PHP 或 JS 根本不会被提交。

https://github.com/netresearch/git-client-hooks找到它们的钩子代码

We use a central server for development, and our git hooks get automatically installed because we provide a central git repository template that gets used automatically when you git clone or git init .

这样的钩子脚本是否已经存在? 在哪里?

此处提供了一种使用 git 挂钩运行 PHP linters 的方法: https://github.com/stevegrunwell/wp-enforcer

我没有直接使用 pre-commit/pre-recieve 钩子等的确切答案。

我从另一种方式解决这个问题,运行 CI 服务器,(我使用 jenkins)运行 phpcs 和 Jenkins 的 checkstyle 插件。

这使我可以根据 checkstyle 报告使构建和 email 提交者失败。

可选地,我可以设置阈值,因此如果有多达 5 个新样式违规,我会得到一个不稳定的构建,但如果提交超过 5 个则会失败。

我还可以设置总体阈值,因此整个项目中超过 10 次违规会导致失败并通过电子邮件发送给团队。

如上所述,这可能是您的中间服务器。 构建后操作可以包括推送到另一个 git 存储库。

我们使用 git 包装器(为了我们的目的,用更合理的东西替换 git-submodules),它具有从魔法目录自动设置预提交挂钩的副作用。 由于这是在商业环境中,因此没有抱怨(无论如何都有办法将其关闭)。

我也试过这个。 目前我手头没有代码,但我使用了其中一个钩子(不是预接收,我认为是更新的钩子)来临时签出新的 ref。 你可以通过一个只需要更新的签出树和只做浅克隆来加快这个速度。

这允许访问整个源代码树,您不仅可以在推送更改的文件上运行 CS,还可以运行单元测试或冒烟测试。

我也同意其他一些评论,即这些测试应该保持在最低限度,因为没有什么比被提交钩子阻塞更烦人的了。 任何进一步的检查都应该在您的 CI 服务器或部署系统中进行。

检查这个项目: https://github.com/phpro/grumphp它无法安装预接收挂钩,但可能会解决您的跨操作系统预提交挂钩问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM