paint-brush
使用 Git Hooks 增强您的 DevOps经过@infinity
2,996 讀數
2,996 讀數

使用 Git Hooks 增强您的 DevOps

经过 Rishabh Agarwal4m2023/09/07
Read on Terminal Reader

太長; 讀書

对于那些试图简化开发和部署流程的公司来说,DevOps 已成为软件开发领域不可或缺的组成部分。在多种可用的 DevOps 技术中,有一种有时会被忽视但确实有效的技术。这项重要的技术正是“Git Hooks”。
featured image - 使用 Git Hooks 增强您的 DevOps
Rishabh Agarwal HackerNoon profile picture

对于那些试图简化开发和部署流程的公司来说,DevOps 已成为软件开发领域不可或缺的组成部分。在多种可用的 DevOps 技术中,有一种有时会被忽视但确实有效的技术。


这项重要的技术正是“ Git Hooks”


Git Hooks 是自动化任务、执行编码标准、执行持续部署和运行测试的绝佳工具。


让我们看看如何使用 Git Hooks 彻底改变我们的 DevOps 实践!

首先,什么是 Hook?

我们先看一下官方的定义——


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 Hook!

让我们尝试构建一个简单的 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 允许我们为许多执行点创建钩子。其中一些如下 -


  1. 预提交挂钩:此挂钩在创建提交之前执行。它使我们能够验证正在提交的更改。


  2. 预接收挂钩:预接收挂钩在修改任何引用之前在远程存储库上运行,允许您应用自定义规则或策略。


  3. Post-Receive Hook:在更新引用后,该钩子也会在远程存储库上执行。它可用于发送通知和/或执行其他任务。


  4. Pre-Push Hook:此钩子在推送之前执行。这可用于强制执行某些策略,阻止推送某些类型的提交。


  5. 准备提交消息钩子:准备提交消息钩子在创建提交消息后执行,允许您修改或增强提交消息。


还有各种其他挂钩可以更好地自定义 Git,可以在Git 文档中找到它们。


如果使用得当,Git hooks 是一个潜力巨大的工具!我们,开发人员,经常削弱这些可以解决许多复杂任务的工具的力量。


对于希望将 DevOps 集成到其开发周期中的组织来说,使用 Git Hooks 可以在任何级别增强 DevOps。


恭喜您走到这一步!我希望你今天学到了一些新东西。