对于那些试图简化开发和部署流程的公司来说,DevOps 已成为软件开发领域不可或缺的组成部分。在多种可用的 DevOps 技术中,有一种有时会被忽视但确实有效的技术。
这项重要的技术正是“ Git Hooks” 。 ”
Git Hooks 是自动化任务、执行编码标准、执行持续部署和运行测试的绝佳工具。
让我们看看如何使用 Git Hooks 彻底改变我们的 DevOps 实践!
我们先看一下官方的定义——
Hooks 是可以放置在 hooks 目录中的程序,以便在 git 执行的某些点触发操作。
幸运的是,这是一个非常简单的定义!
让我们尝试解决读者可能对定义提出的一些问题。
问)什么是 Hooks 目录?它位于哪里?
hooks 目录是 Git 存储库中的一个目录,其中包含 Git 将执行的可执行程序或 Hook。默认情况下,hooks 目录为$GIT_DIR/hooks
。用户还可以使用core.hooksPath
配置变量来配置它。
问)Git 的执行点是什么?
Git 执行点是 Git 工作流程中可以运行挂钩的步骤。预提交、提交后、推送前、接收后、变基前和合并后是 Git 执行点的一些示例。
总结本节,我们可以对 Git Hooks 进行以下定义:
Git 在提交、推送或合并代码等特定操作之前或之后执行称为“挂钩”的脚本。它们允许您在开发过程中自动执行任务、执行策略以及与代码库交互。 Git hooks 存储在Git 存储库的
.git/hooks
目录中
让我们尝试构建一个简单的 Git 挂钩,将“TASK*”正则表达式强加到任何提交消息上。
创建一个新目录git_hooks_tut
,并在其中初始化一个新的 git 存储库。
~/projects$ mkdir git_hooks_tut ~/projects$ cd git_hooks_tut ~/projects/git_hooks_tut$ git init Initialized empty Git repository
让我们进入 hooks 目录并研究它的内容。
~/projects/git_hooks_tut$ cd .git/hooks ~/projects/git_hooks_tut/.git/hooks$ ls applypatch-msg.sample pre-applypatch.sample pre-push.sample commit-msg.sample pre-commit.sample pre-rebase.sample fsmonitor-watchman.sample pre-merge-commit.sample pre-receive.sample post-update.sample prepare-commit-msg.sample update.sample
hooks 目录附带了一些示例脚本。默认情况下, .sample
扩展名会阻止它们运行。要“安装”挂钩,您所需要做的就是删除.sample
扩展名。
或者,如果您从头开始使用新脚本,则只需添加一个名称与上面列出的文件名之一匹配的新文件,但不带.sample
扩展名。
对于我们的用例,我们需要有一个 commit-msg 挂钩。继续创建一个名为commit-msg
的新脚本。
~/projects/git_hooks_tut/.git/hooks$ touch commit-msg
让我们添加逻辑以确保我们的提交消息模式到commit-msg
脚本中。
#!/bin/sh commit_msg_file=$1 commit_msg=$(cat "$commit_msg_file") # Check if the commit message starts with "TASK" if ! echo "$commit_msg" | grep -q "^TASK"; then echo "Commit message must start with 'TASK'" exit 1 fi
最后,使commit-msg
脚本可执行。不可执行的脚本会被 git 跳过,即使它们存在于 hooks 目录中。
~/projects/git_hooks_tut/.git/hooks$ chmod +x commit-msg
通过这个设置,我们的钩子就完成了!现在让我们测试一下。
我们现在将创建一个新文件并尝试提交它;首先使用无效的消息格式,然后使用有效的消息格式。
~/projects/git_hooks_tut/.git/hooks$ cd ../.. ~/projects/git_hooks_tut$ touch README ~/projects/git_hooks_tut$ ls README ~/projects/git_hooks_tut$ git add README ~/projects/git_hooks_tut$ git commit -m "Added Readme File" Commit message must start with 'TASK' ~/projects/git_hooks_tut$ git commit -m "TASK-0000: Added Readme File" [master (root-commit) 7f3648a] TASK-000: Added Readme File
一切进展顺利!
Git 允许我们为许多执行点创建钩子。其中一些如下 -
预提交挂钩:此挂钩在创建提交之前执行。它使我们能够验证正在提交的更改。
预接收挂钩:预接收挂钩在修改任何引用之前在远程存储库上运行,允许您应用自定义规则或策略。
Post-Receive Hook:在更新引用后,该钩子也会在远程存储库上执行。它可用于发送通知和/或执行其他任务。
Pre-Push Hook:此钩子在推送之前执行。这可用于强制执行某些策略,阻止推送某些类型的提交。
准备提交消息钩子:准备提交消息钩子在创建提交消息后执行,允许您修改或增强提交消息。
还有各种其他挂钩可以更好地自定义 Git,可以在Git 文档中找到它们。
如果使用得当,Git hooks 是一个潜力巨大的工具!我们,开发人员,经常削弱这些可以解决许多复杂任务的工具的力量。
对于希望将 DevOps 集成到其开发周期中的组织来说,使用 Git Hooks 可以在任何级别增强 DevOps。
恭喜您走到这一步!我希望你今天学到了一些新东西。