钥匙要点
- git挂钩是在某些操作之前或之后运行的简单脚本,例如对文件的测试语法进行测试语法,并且可以用环境可以使用的任何语言编写。 存在两种类型的挂钩:在开发人员的系统上运行的客户端,以及在托管Git存储库的服务器上运行的服务器端。
- > git挂钩不是与您的项目分配的,也不能自动安装它们,因此为您的钩子创建一个生活并告诉您的合作者使用它们是有益的。
>>>>>> > git钩是自动化项目工作流程,使您能够验证代码,提交消息,确保环境适当以及更多的强大手段。 - >
- git钩是在某些操作之前或之后运行的简单脚本。它们对于各种任务很有用,但是我主要发现它们对于客户端验证有用,因此可以防止简单的错误。例如,您可以在要投入的文件上测试语法,甚至可以运行测试。我写的钩子可以验证树枝语法,将jshint运行到标准等等。 > 通过设计,Git钩子也非常简单。如果脚本是可执行的,则Git将运行这些挂钩,并且GIT将允许操作(例如,提交或推动)只要挂钩退出而没有错误(状态0)。挂钩可以用环境可以使用的任何语言编写。
有两种类型的钩子:
>客户端 - 这些在开发人员的系统上运行
>服务器端 - 这些运行在托管Git存储库的服务器上
-
本文将不介绍
- >服务器端钩子。但是,请注意,如果您的项目在GitHub之类的服务上,则服务器端挂钩通常不适用。在GitHub上,相当于服务器端挂钩的是使用服务和Webhooks,可以在您的项目设置中找到。 >
- 钩文件
在该目录中,您会看到类似的内容:
>我们将重点关注在允许提交之前运行的前签名挂钩。
示例钩子:验证PHP语法<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>
>我们将以一个非常简单的挂钩开始,用bash编写,该挂钩验证所犯下的php代码具有有效的语法。这是为了防止“快速”但破裂的提交发生。当然,我劝阻几乎没有测试的“简单提交”,但这并不意味着它们不会发生。
>applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.samplein .git/hooks我们可以启动一个名为Pre-Commit的新文件。它必须具有执行权限:
>
<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>
>您可以使用自己喜欢的编辑器开始写作。首先,我们需要Shebang。我最喜欢的方法是使用/usr/bin/env,因为这使用了我们想要的应用程序的正确路径,而不是硬编码且可能是无效的路径。目前,我们将不断失败,以便我们可以轻松测试。
>applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.samplePHP具有语法验证的有用选项:-l。它需要一个文件参数,因此我们将不得不循环浏览正在更改的任何PHP文件。为简单起见,我们将假设任何投入的PHP文件始终以.php结尾。由于挂钩是从存储库的根部运行的,因此我们可以使用标准GIT命令获取有关更改的信息,例如GIT状态。
#Always Fail Line上方,我们可以使用以下内容来修改所有PHP文件:
>说明:
<span>cd .git/hooks </span><span>touch pre-commit </span><span>chmod +x pre-commit</span>
> php_files =在没有定界符的情况下完成bash分配,但请注意,引用变量需要$ deLimiter
- $()是“获取输出”的语法。不需要引用它。
- > grep被用于检查添加(a)和修改文件(m)
- > >尴尬在这里用于打印$ 2。完整的git状态 - 刚开始时有额外的空间和额外的数据,因此我们要删除它。尴尬还可以自动剥离。
- grep再次被使用,但现在正在检查以确保行以.php
- 结束
- 现在,我们可以用for循环验证每个文件:
这似乎有些奇怪,但是! php -l“ $ i”(请注意避免空间问题的引号)实际上是在检查0的返回值为0,而不是true或我们通常在其他语言中期望的任何值。仅供参考,大约等效的PHP代码将是:
<span>#!/usr/bin/env bash </span><span># Hook that checks PHP syntax </span> <span># Override IFS so that spaces do not count as delimiters </span><span>old_ifs=$IFS </span><span><span>IFS</span>=$'<span title="\n">\n'</span> </span> <span># Always fail </span><span>exit 1</span>我对SRC/SYMFONY/COMPONEN/FINDER/GLOB.PHP进行了错误的更改,目的是测试此问题,而Git Commit -M'test'的输出就像:
>我使循环尽早退出了整个脚本,最终可能不是我们想要的。实际上,我们可能希望摘要要解决的问题,而不是必须继续尝试进行。任何人最终都会很容易感到沮丧,甚至可能学会使用git commits-不 - 验证以完全绕过钩子。
<span>php_files=<span>$(git status --short | grep -E '^(A|M)' | awk '{ print }' | grep -E '\.php$')</span></span>>
因此,我们不要以php -L的错误退出,但我仍然想保持易于阅读的内容:
>我进行了两个不良修改,并尝试进行提交的尝试看起来像这样:
<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>现在的行动是解决这些问题,测试并尝试再次提交。
要完成钩子脚本,请在脚本底部删除1个出口1。尝试提交有效的PHP文件,并且应该按正常工作。
共享钩子钩子未与您的项目分发,也不能自动安装它们。因此,您最好的行动是为您创建一个钩子居住的地方(可能位于同一存储库中),并告诉您的合作者使用它们。如果您对他们来说很容易,那么他们更有可能这样做。
>
>做到这一点的一种简单方法是创建一个挂钩目录和一个简单的安装程序install-hooks.sh链接它们(而不是复制):
任何克隆您的项目的任何人都可以简单地运行bash install-hooks.sh克隆后。
>applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.sample这也具有将钩子保持在版本控制下的好处。
>
其他钩子
prepary-commit-msg - 如果没有给出一个默认提交消息。
>- commit-msg - 提交消息验证。
- >后委员会 - 在成功的提交后运行。
- 预算 - 在验证遥控器后的GIT推动之前运行。它需要2个参数:遥控器的名称,以及它的URL。
- > > reperbase - 在git rebase之前运行。
- >后签名 - 成功结帐后运行。
- >后合并 - 成功合并后运行。
- 这些钩子通常与预先投入的钩子相同,尽管它们会参与争论。检查后的一个用例是确保文件始终获得适当的权限(因为GIT仅跟踪可执行文件,而不是可执行的和符号链接):
>>>>>
[subproject] message
<span>cd .git/hooks </span><span>touch pre-commit </span><span>chmod +x pre-commit</span>
结论 git钩是自动化项目工作流程的强大手段。您可以验证代码,提交消息,确保环境正确,还有很多。您使用Git钩子有什么有趣的东西吗?在评论中让我们知道!
><span>#!/usr/bin/env bash </span><span># Hook that checks PHP syntax </span> <span># Override IFS so that spaces do not count as delimiters </span><span>old_ifs=$IFS </span><span><span>IFS</span>=$'<span title="\n">\n'</span> </span> <span># Always fail </span><span>exit 1</span>经常询问有关git钩的问题(常见问题解答)
git挂钩的不同类型是什么?客户端钩子是由诸如投入和合并之类的操作触发的,而服务器端挂钩在网络操作上运行,例如接收推动提交。可以自定义每个钩子以满足您的特定操作需求。
如何创建一个git挂钩?
创建一个git钩,导航到存储库中的.git/hooks目录。在这里,您会找到各种挂钩的示例脚本。要创建一个新的钩子,请创建一个没有任何扩展名的文件(例如,预先命中),使其可执行,并编写您的脚本。
>如何使用git挂钩进行自动化?
> git钩可用于自动化开发工作流中的各种任务。例如,您可以在每个提交之前使用预制挂钩自动运行测试或代码上的衬里。这样可以确保仅测试和正确格式的代码才能将其投入到存储库中。
我可以与我的团队共享git钩吗?
默认情况下,当您克隆一个存储库时,不包括git挂钩。这是因为它们存储在.git目录中,该目录未版本化。但是,您可以通过将它们存储在项目中的单独目录中,并创建一个脚本以将它们链接到.git/hooks中。
>我如何使用git挂钩执行政策? >
> git挂钩可用于执行项目或公司政策。例如,您可以在服务器端使用接收前的钩子来拒绝任何不符合您策略的推动(例如,提交不遵循某种格式的提交)。>
我可以用来写git钩吗?
git挂钩是脚本,因此您可以用任何脚本语言编写它们。默认样本是用bash编写的,但是您可以使用任何您喜欢的语言,例如Python或Ruby。 GIT钩可用于将Git与其他工具集成在一起。例如,您可以使用邮票后钩子在连续集成服务器中触发构建或在您的问题跟踪系统中更新票证。>
如何调试git钩?调试git挂钩可以通过将信息写入挂钩脚本的文件来完成。例如,您可以将命令的输出重定向到日志文件以稍后进行检查。>我可以忽略git钩吗?提交,您可以将–No-Verify选项与Git Commit命令一起使用。当您进行不需要钩子中实现的支票的次要更改时,这可能很有用。>
强大,应谨慎使用它们。书面不好的钩子可能会导致问题,包括拒绝所有提交甚至数据丢失。部署之前,请务必彻底测试您的钩子。以上是git钩介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

与这些顶级开发人员新闻通讯有关最新技术趋势的了解! 这个精选的清单为每个人提供了一些东西,从AI爱好者到经验丰富的后端和前端开发人员。 选择您的收藏夹并节省时间搜索REL

该教程通过使用AWS服务来指导您通过构建无服务器图像处理管道。 我们将创建一个部署在ECS Fargate群集上的next.js前端,与API网关,Lambda函数,S3桶和DynamoDB进行交互。 Th

该试点程序是CNCF(云本机计算基础),安培计算,Equinix金属和驱动的合作,简化了CNCF GitHub项目的ARM64 CI/CD。 该计划解决了安全问题和绩效

此基于GO的网络漏洞扫描仪有效地确定了潜在的安全弱点。 它利用了GO的并发功能的速度功能,包括服务检测和漏洞匹配。让我们探索它的能力和道德


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

Dreamweaver Mac版
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能