首页 文章

Git:使用PHP_CodeSniffer预接收挂钩

提问于
浏览
13

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

使用Git,您只能以任何方式在客户端上预先提交挂钩cannot be enforced . 更糟糕的是,我们让开发人员使用所有三个主要操作系统,因此在Linux或OS X上运行的预提交挂钩不会自动在Windows上运行 .

要做的就是在服务器上实现 pre-receive 钩子,但解决方案并不像看起来那么容易:

想象一下,开发人员做了20次提交并希望推动它们 . 我知道的所有预提交和预接收挂钩(12)只检查单个提交,这将最终失败并阻止推送 . 现在,开发人员修复了问题并进行了另一次提交,并尝试再次推送 . 由于钩子检查单个提交,它将再次失败 .

所以我们需要一个 pre-receive 钩子,它会在所有要推送的提交中生成所有已更改文件的列表,并仅在当前状态下运行phpcs .

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

编辑:似乎有一个script that creates that list of files - 不幸的是在Python中,但可以移植 . 我仍然对PHPCS的预制解决方案感兴趣:)

13 回答

  • 1

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

    您可以设置一个中间存储库,它可以非常定期地获取每个开发人员的分支,并审核每个新提交,如果提交无法满足某些预定义标准,则发送电子邮件 .

    您也可以在中央仓库上预先接收挂钩,但至少开发人员会更快意识到潜在问题 .

  • 2

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

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

    总而言之,我理解编码标准的重要性,我也强制执行,但是它有一个社会组件(或方面) .

    听起来和你一起工作的人要么不知道更好(还是)还是不愿意学习 . 所以,如果他们不知道更好,你必须与他们合作并教他们遵守你的要求 . 这包括教他们为什么约定很重要,最后他们需要了解在一切都是绿色之前不会完成一项功能 .

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

    • 功能本身

    • phpcs

    • 文档

    • 单位测试

    (没有具体的顺序 . ;-))

    如果他们不愿意学习,你总是可以采取更激烈的措施 . 就像,我会慢慢开始,每周进行一次性能评估(1对1的情况)并重申为什么他们不这样做 . 如果这没有帮助 - 我想你会 grab 我的漂移 .

  • 0

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

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

    基本上,除了改述之外,你所描述的问题没有好的解决办法;它不是“阻止可检测到的违规”,而是“报告可检测到的违规行为” . 我认为这是你能做的最好的事情 .

  • 0

    使用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

    泰瑞尔

  • 2

    我并没有说好'git-anese',但在Mercurial中有一个名为'changegroup'的钩子选项,它基本上检查一组传入提交的'top'提交 . 也许社区中的某个人可以告诉你如果有一个等价物 . git的'changegroup'是什么?

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

  • 1

    也许这个问题的答案有帮助吗? Git pre-receive hook

  • -1

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

    并修改它也用phpcs测试代码 .

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

  • 2

    我没有直接使用预先提交/预先接收挂钩等对此问题的确切答案 .

    我从另一个方面处理这个问题,运行一个CI服务器,(我使用jenkins)运行phpcs和Jenkins的checkstyle插件 .

    这允许我根据checkstyle报告使构建失败并通过电子邮件发送提交者 .

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

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

    如上所述,这可能是您的中间服务器 . post构建操作可以包括Push to another git repo .

  • 2

    我们使用git包装器(为了我们的目的替换git-submodules更加理智)并且它具有从魔术目录自动设置预提交挂钩的副作用 . 由于这是在商业环境中,没有抱怨(并且有办法将其关闭) .

  • 2

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

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

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

  • 0

    我们现在使用预提交钩子来检查代码和提交消息 .

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

    钩子很重要,因为它会在文件被破坏时发现,因此破解的PHP或JS根本不会被提交 .

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

    我们使用中央服务器进行开发,我们的git钩子会自动安装,因为我们提供了一个中央git存储库模板,当你 git clonegit init 时会自动使用它 .

  • 0

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

    这里提供了一个使用git hook运行PHP linters的方法:https://github.com/stevegrunwell/wp-enforcer

  • 0

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

相关问题