iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >在 Swift 中编写Git Hooks脚本的方法
  • 663
分享到

在 Swift 中编写Git Hooks脚本的方法

2024-04-02 19:04:59 663人浏览 泡泡鱼
摘要

目录前言用git hooks自动生成提交信息为什么我使用Swift?让我们开始吧编写git钩子检索提交消息注意:检索问题编号修改提交信息设置git钩子测试结果参考资料前言 这周,我决

前言

这周,我决定完成因为工作而推迟了一周的TODO事项来改进我的Git工作流程。

为了在提交的时候尽可能多的携带上下文信息,我们让提交信息包含了正在处理的JIRA编号。这样,将来如果有人回到我们现在正在提交的源代码,输入​ ​git blame​ ​,就能很容易的找出JIRA的编号。

每次提交都包含这些信息可能会有点乏味(如果你使用了类似TDD[1]之类的方法,您会提交的更加频繁),而且,尽管像Tower[2]这样的git客户端会让此变得容易一些,但是您仍然需要手动将问题编号复制粘贴到提交消息中,并且记住这样做,这是我最难以解决的问题:sweat_smile:。

出于这个原因,我开始寻求了解git hooks,试图自动化这项任务。我的想法是能够从git分支获取JIRA编号(我们有一个分支命名约定,形如:story/ISSUE-1234_branch-name),然后将提交消息更改为以JIRA编号为前缀,从而生成最终结果消息:ISSUE-1234-其他原本的提交信息。

用git hooks自动生成提交信息

​Git Hooks[3] 提供了一种在运行某些重要的git命令时触发自定义操作的方法,例如在一次commit或者push之前执行一些操作。

在本例中,我使用了 commit-msg 钩子,它能够在当前提交信息生效前修改此信息。钩子由一个参数调用,该参数是指向包含用户输入的提交消息的文件的路径。这意味着,为了改变提交消息,我们只需要从文件中读取、修改其内容,然后写回调用挂钩的文件。

要创建git钩子,我们需要在 .git/hooks​ 路经下提供一个可执行脚本。我的钩子放在了 .git/hooks/commit-msg 路经之下。

为什么我使用Swift?

Git hooks可以使用任何你熟悉的,并且在主机上安装了解释器(通过shebang来指定)的脚本语言来编写。

虽然有很多更受欢迎的选项,比如bash​、ruby等等,但我还是决定使用Swift。因为我对Swift更熟悉,因为我每天都在使用它,而且我真的非常喜欢它强大的类型语法以及低内存占用。

让我们开始吧

你可以使用任何你喜欢的IDE编写Swift脚本。但是如果你想要有适当的代码补全以及调试能力,你可以为其创建一个Xcode项目。为此,在 MacOS​ 下选择 Command Line Tool 创建一个新的项目。

在创建的文件顶部加上Swift shebang,引入Foundation库。

#!/usr/bin/swift
import Foundation

这样当git执行文件时,shebang将确保使用文件作为输入数据调用/usr/bin/swift二进制文件。

编写git钩子

项目已经全部设置好,所以现在可以编写git挂钩了。让我们走完所有的步骤。

检索提交消息

要做的第一件事就是从脚本传进来的参数检索临时提交文件的路径然后读取文件内容。

let commitMessageFile = CommandLine.arguments[1]
guard let data = FileManager.default.contents(atPath: commitMessageFile),
      let commitMessage = String(data: data, encoding: .utf8) else {
    exit(1)
}

在上面的代码片段中,我们首先拿到了提交文件的路径(git​传递给脚本),然后通过FileManagerapi​读取了文件内容。如果因为一些原因检索失败了,我们退出(exit​)脚本同时返回状态码1,这将告诉git终止此次提交。

注意:

根据git hooks文档,如果任何钩子脚本返回的状态码大于​ ​0​ ​,它都将终止即将要要发生的操作。这将在本文后面的部分中使用,以便在不需要做任何修改而优雅地退出。

检索问题编号

既然提交信息的字符串已经可用,接下来就需要找到当前分支并从中检索到问题编号。正如本文前面提到的,这只可能是因为团队对分支命名的严格格式,在其名称中始终包含JIRA编号(例如,story/ISSUE-1234_some-awesome-feature-work)。

为了实现这一点,我们必须检索当前的工作分支,然后用正则表达式从中检索问题编号。

让我们从添加脚本调用zsh shell​命令的能力开始。通过使用Process​api,脚本可以与git命令行界面交互。

func shell(_ command: String) -> String {
    let task = Process()
    let outputPipe = Pipe()
    let errorPipe = Pipe()    
    task.standardOutput = outputPipe
    task.standardError = errorPipe
    task.arguments = ["-c", command]
    task.executableURL = URL(fileURLWithPath: "/bin/zsh")  
    do {
        try task.run()
        task.waitUntilExit()
    } catch {
        print("There was an error running the command: \(command)")
        print(error.localizedDescription)
        exit(1)
    }   
    guard let outputData = try? outputPipe.fileHandleForReading.readToEnd(),
          let outputString = String(data: outputData, encoding: .utf8) else {
        // Print error if needed
        if let errorData = try? errorPipe.fileHandleForReading.readToEnd(),
           let errorString = String(data: errorData, encoding: .utf8) {
            print("Encountered the following error running the command:")
            print(errorString)
        }
        exit(1)
    }    
    return outputString
}

现在实现了shell​命令,那么就可以使用它询问git当前分支是什么,然后尽可能的从中提取出问题编号。

let gitBranchName = shell("git rev-parse --abbrev-ref HEAD")
    .trimminGCharacters(in: .newlines)
let stringRange = NSRange(location: 0, length: gitBranchName.utf16.count)
guard let regex = try? NSRegularExpression(pattern: #"(\w*-\d*)"#, options: .anchorsMatchLines),
    let match = regex.firstMatch(in: gitBranchName, range: stringRange) else {
    exit(0)
}
let range = match.range(at: 1)
let ticketNumber = (gitBranchName as NSString)
    .substring(with: range)
    .trimmingCharacters(in: .newlines)

请注意,如果没有匹配项(即分支名称中不包含JIRA问题编号),脚本将以0的状态退出,允许提交继续进行,而不进行任何更改。这是为了不破坏诸如main或其他测试/调查分支中的工作流。

修改提交信息

为了更改提交消息,必须将脚本开头读取的文件内容(包含提交消息)写回同一路径。

在这种情况下,只需要做一个更改,即在提交信息的前面加上JIRA编号和(-),以将其与提交信息的其余部分很好地分开。还必须确保检查了提交信息字符串,仅在编号不存在时才添加编号:

if !commitMessage.contains(ticketNumber) {
    do {
        try "\(ticketNumber) - \(commitMessage.trimmingCharacters(in: .newlines))"
            .write(toFile: commitMessageFile, atomically: true, encoding: .utf8)
    } catch {
        print("Could not write to file \(commitMessageFile)")
        exit(1)
    }
}

设置git钩子

现在脚本已经准备好了,是时候把它放在git可以找到它的位置了。Git钩子可以全局设置,也可以基于单个repo设置。

我个人对这类脚本的偏好是基于单个repo设置,因为这样可以在出现问题时为您提供更多的控制和可见性,并且如果钩子开始失败,它会在它设置的repo中失败,而不是全局都失败。

要设置它们,我们只需要使文件可执行,重命名并将其复制到所要设置repo的.git/hooks/路径之下:

chmod +x main.swift
mv main.swift <path_to_your_repo>/.git/hooks/commit-msg

测试结果

现在repo已经全部设置好了,剩下的就是对部署的脚本进行测试。在下面的截屏中,创建了两个分支,一个带有问题编号,一个没有,它们有着相同的提交信息。可以看出脚本运行正常,并且只在需要时才更改提交消息!

参考资料

[1]  TDD:  https://en.wikipedia.org/wiki/Test-driven_development。

[2]  Tower:  Https://www.git-tower.com/mac。

[3]  Git Hooks:  https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks。

到此这篇关于在 Swift 中编写脚本:Git Hooks的文章就介绍到这了,更多相关Git Hooks脚本编写内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在 Swift 中编写Git Hooks脚本的方法

本文链接: https://www.lsjlt.com/news/152717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在 Swift 中编写Git Hooks脚本的方法
    目录前言用git hooks自动生成提交信息为什么我使用Swift?让我们开始吧编写git钩子检索提交消息注意:检索问题编号修改提交信息设置git钩子测试结果参考资料前言 这周,我决...
    99+
    2024-04-02
  • 教你编写Pipeline脚本的方法
    目录前言调试 grok 和 pipelineGrok 通配搜索多行如何处理Pipeline 字段命名注意事项完整 Pipeline 示例如何在一个 Pipeline 中切割多种不同格...
    99+
    2022-11-13
    Pipeline 脚本 编写 Pipeline 脚本
  • Python抢购脚本的编写方法
    想买mate40,但总是抢不到,所以想试着能不能写个脚本代码。 第一步:把想要抢购的商品加进购物车,注意:脚本是对购物车内全部商品进行下单操作,所以不够买的商品最好先从购物车内删除。...
    99+
    2024-04-02
  • Linux的脚本编写方法有哪些
    这篇文章主要介绍了Linux的脚本编写方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的脚本编写方法有哪些文章都会有所收获,下面我们一起来看看吧。code 1#!/bin/sh脚本的第一行,看...
    99+
    2023-06-17
  • 脚本自动添加crontab的编写方法
    这篇文章主要讲解了“脚本自动添加crontab的编写方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“脚本自动添加crontab的编写方法”吧!代码如下:#!/bin/sh BASEDIR=...
    99+
    2023-06-09
  • linux编写shell脚本的方法是什么
    编写Linux shell脚本有以下几个步骤:1. 选择shell:Linux有多种shell,如Bash、sh、csh等。其中Ba...
    99+
    2023-09-17
    linux shell
  • 编写健壮的Bash脚本的方法教程
    这篇文章主要讲解了“编写健壮的Bash脚本的方法教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“编写健壮的Bash脚本的方法教程”吧!shell脚本在运行异常时会受到非常大的影响。本文介绍...
    99+
    2023-06-09
  • 一个实用的iptables脚本的编写方法
    本篇内容介绍了“一个实用的iptables脚本的编写方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:#!/bin/sh#modp...
    99+
    2023-06-09
  • Windows编写jar启动脚本和关闭脚本的操作方法
    目录前言启动脚本编写关闭脚本restart.bat 重启脚本前言 假设项目打包后,项目结构为: 此时如果需要再windows环境中进行项目的启动或关闭,需要频繁的手敲命令,很不方便...
    99+
    2022-12-29
    Windows编写jar启动脚本 Windows jar关闭脚本 Windows jar脚本
  • 编写Python自动化脚本的方法教程
    这篇文章主要介绍“编写Python自动化脚本的方法教程”,在日常操作中,相信很多人在编写Python自动化脚本的方法教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”编写Python自动化脚本的方法教程”的疑...
    99+
    2023-06-16
  • Swift语言编写代码的方法有哪些
    本篇内容主要讲解“Swift语言编写代码的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swift语言编写代码的方法有哪些”吧!在初始化时调用will...
    99+
    2024-04-02
  • 在Golang中实现脚本编程的方法是什么?
    如何在 Golang 中实现脚本编程功能? 随着计算机领域的不断发展,脚本编程在日常开发中扮演着越来越重要的角色。而对于一些基于 Golang 的开发者来说,如何在 Golang 中实...
    99+
    2024-02-26
    脚本 golang 实现 标准库
  • Python手机与电脑游戏脚本的编写方法
    目录前言分析(x0)分析(x1)那么如何去确定这个像素范围呢?那么如何去判断出哪个块是黑块呢?视频教程源代码关于pyautogui的安装1、下载后安装2、检测安装是否成功前言 大家好...
    99+
    2024-04-02
  • 在Nodejs中如何用zx库编写Shell脚本
    这篇文章主要介绍“在Nodejs中如何用zx库编写Shell脚本”,在日常操作中,相信很多人在在Nodejs中如何用zx库编写Shell脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 如何在linux中编写.sh脚本并赋权限
    如何在linux中编写.sh脚本并赋权限?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先vi  gitpull.sh或者使用vim编辑器。内容#!/bin/sh&n...
    99+
    2023-06-09
  • nodejs编写bash脚本的终极方案分享
    目录前言zx库$`command`cd()fetch()question()sleep()nothrow()chalkfsos$.shell$.quote传递环境变量传递数组总结前言...
    99+
    2024-04-02
  • 如何在PHP中编写高效的HTTP负载测试脚本?
    在PHP中编写高效的HTTP负载测试脚本是一项非常有挑战性的任务。在这篇文章中,我们将讨论如何编写高效的HTTP负载测试脚本,以确保您的网站在高流量情况下能够正常运行。 一、使用PHP的cURL库 cURL是一个强大的PHP库,可以用于发送...
    99+
    2023-09-30
    http load shell
  • 如何在Unix容器中使用Python编写索引脚本?
    Unix容器是一种轻量级的虚拟化技术,可以提供一种隔离的环境,使得多个应用程序可以在同一台物理服务器上运行。Python是一种广泛使用的编程语言,其强大的数据处理和分析能力在各个领域中得到广泛应用。在Unix容器中使用Python编写索引脚...
    99+
    2023-09-20
    unix 容器 索引
  • unity编辑脚本的方法是什么
    在Unity中编辑脚本有以下几种方法:1. 使用Unity内置的代码编辑器:Unity提供了一个内置的脚本编辑器,可以直接在Unit...
    99+
    2023-09-29
    unity
  • Python手机与电脑游戏脚本的编写方法是怎样的
    Python手机与电脑游戏脚本的编写方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言大家好,我叫善念。我发现我的粉丝量涨的很慢,这次厚脸皮要波关注。这次做的是一个...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作