使用Git Hooks改进Go开发流程

Git Hooks是一种非常强大的改进开发工作流的方法,不需要记住运行额外的脚本或执行额外的任务。本文介绍如何在项目仓库中自定义git Hooks实现对Go代码的格式化。

这个例子可以让你知道如何在自己的的项目中使用git Hooks。

实际案例

这方面的一个例子来自我当前的一个项目,在这个项目中,团队必须在将密匙文件推入项目仓库之前对它们进行加密。加密文件本身就一行代码的事,但由于我们项目中密匙文件的数量大了,要记住每个修改过的密匙文件,变成了一个挑战,我们会为没有重新加密密匙文件而抓狂。

解决方案

当我们试图解决这个问题时,我们能够使用的工具相当有限,并且我们不希望使用那些可能对部分有自己开发习惯的团队成员造成影响。这就是Git Hooks发挥作用的地方了。有了Git Hooks,可以定义一个简单的“pre-commit” hook脚本,它将自动执行对未加密的密匙文件的加密,并添加到commit任务中去。可以通过在hooks/目录中创建这些hooks,让它成为团队开发流程中的可选插件,这样如果想把这些hooks添加到他们自己的开发流程中的话,可以通过一个简单的命令(git config core.hooksPath hooks)配置即可。

创建Git Hook

Hooks实际上创建起来非常简单,因为它们只是在特定目录中具有特定名称的bash脚本。当您下次执行给定的git命令时,它将自动执行这个bash脚本,前提是该脚本是对应特定命令的正确命名文件。

先进入到项目的代码仓库进入.git隐藏目录,可以看到如下目录和文件:

root@CloudEdge1:/home/zjlab/goRestAPI-docker/.git# ls -l
total 48
drwxr-xr-x  2 root root 4096 Feb 24 09:37 branches
-rw-r--r--  1 root root  261 Feb 24 10:51 COMMIT_EDITMSG
-rw-r--r--  1 root root  275 Feb 24 09:37 config
-rw-r--r--  1 root root   73 Feb 24 09:37 description
-rw-r--r--  1 root root   21 Feb 24 09:37 HEAD
drwxr-xr-x  2 root root 4096 Feb 24 09:37 hooks
-rw-r--r--  1 root root  642 Feb 24 10:45 index
drwxr-xr-x  2 root root 4096 Feb 24 09:37 info
drwxr-xr-x  3 root root 4096 Feb 24 09:37 logs
drwxr-xr-x 19 root root 4096 Feb 24 10:45 objects
-rw-r--r--  1 root root  112 Feb 24 09:37 packed-refs
drwxr-xr-x  5 root root 4096 Feb 24 09:37 refs

上面有个hooks目录,就是存放我们将要定义的Git hooks脚本的目录:

root@CloudEdge1:/home/zjlab/goRestAPI-docker/.git/hooks# ls -l
total 48
-rwxr-xr-x 1 root root  478 Feb 24 09:37 applypatch-msg.sample
-rwxr-xr-x 1 root root  896 Feb 24 09:37 commit-msg.sample
-rwxr-xr-x 1 root root 3327 Feb 24 09:37 fsmonitor-watchman.sample
-rwxr-xr-x 1 root root  189 Feb 24 09:37 post-update.sample
-rwxr-xr-x 1 root root  424 Feb 24 09:37 pre-applypatch.sample
-rwxr-xr-x 1 root root 1642 Feb 24 09:37 pre-commit.sample
-rwxr-xr-x 1 root root 1492 Feb 24 09:37 prepare-commit-msg.sample
-rwxr-xr-x 1 root root 1348 Feb 24 09:37 pre-push.sample
-rwxr-xr-x 1 root root 4898 Feb 24 09:37 pre-rebase.sample
-rwxr-xr-x 1 root root  544 Feb 24 09:37 pre-receive.sample
-rwxr-xr-x 1 root root 3610 Feb 24 09:37 update.sample

下面我们创建格式化Go代码的bash脚本,并命名为pre-commit,因为我们是针对git commit命令创建的hooks,也就是在提交代码前,对Go文件进行格式化。

.git/hooks/pre-commit

#!/bin/bash

echo "Test Hook"

## this will retrieve all of the .go files that have been 
## changed since the last commit
STAGED_GO_FILES=$(git diff --cached --name-only -- '*.go')

## we can check to see if this is empty
if [[ $STAGED_GO_FILES == "" ]]; then
    echo "No Go Files to Update"
## otherwise we can do stuff with these changed go files
else
    for file in $STAGED_GO_FILES; do
        ## format our file
        go fmt $file
        ## add any potential changes from our formatting to the 
        ## commit
        git add $file
    done
fi

现在我们保存任何go代码文件并执行add和commit提交命令,都会自动将使用go fmt命令对go文件进行格式化,然后再提交。

在团队中分发Git Hooks

因为我们的Git Hook保存在hooks/目录中,并不能自动分发到其他的开发者。需要在项目中创建一个.githooks/目录,然后将前面的pre-commit脚本保存到这个目录。这样就可以同其他文件一样提交并跟踪这个脚本,如果要让这个hooks脚本在其他开发者的环境中生效,还需要执行如下命令:

$ git config core.hooksPath .githooks

你可能感兴趣的:(使用Git Hooks改进Go开发流程)