iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
DevOps

Git 其然,Git 其所以然系列 第 17

Integrate:Git Hooks

  • 分享至 

  • xImage
  •  
# Outline
一、論述
A、待敘項目

# TL;DR
...

# Updated
2019-10-06: 更新標題文章結構

在雙十連假前,此系列文每天的發文時都會以最簡陳述為主,以求在繁忙的日常中,至少能先維持挑戰鐵人賽的進度,並且逐漸拓展思路與系列結構。預期會在國慶連假將本篇文章論述完整。

一、論述

還記得我們在 Git init 的那篇文章的目錄結構嗎?讓我先複習 git init 後,.git 最初的目錄結構:

# Location: ~/how-git-works-lab
$ tree .git
.git/
├── HEAD
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info/
│   └── exclude
├── objects/
│   ├── info/
│   └── pack/
└── refs/
    ├── heads/
    └── tags/

在這之中,有一個名為 hooks 的資料夾,裡面擁有許多副檔名為 .sample 的檔案,事實上當我們把 .sample從檔案名稱移除後,這些檔案就會對我的許多 git 操作有影響。

這些檔案實際上就是一個個 Script,而他們的檔名正是這些腳本被執行的時機,就像其目錄名稱一樣。而這些 .sample 檔案可謂是一些範本。

Patch 流程

  • pre-applypatch:
  • applypatch-msg:

Commit 流程

  • pre-commit
  • prepare-commit-msg
  • commit-msg

伺服器端

  • pre-receive
  • update
  • post-update

假設今天的情境是,在進行 commit 前,必須通過測試,那就在 .git/hooks/ 底下新增一個 pre-commit 檔案,內容為:

#!/bin/sh

# Execute testing without output
dotnet test > /dev/null 2>&1

# Restore result (retuen code) of testing
rc=$?

if [ $rc -ne 0 ] ; then
    echo "You should pass the testing before action"
    echo ""
    exit $rc
fi

為了測試這個腳本是否能成功運行,我們將測試專案的 Test1() 方法強制失敗:

using Xunit;

namespace WebProj.Tests
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(false);
        }
    }
}

先執行一次 dotnet test 確認測試必定失敗:

$ dotnet test
Test run for /Users/ironman/dotnet-sln/WebProj.Tests/bin/Debug/netcoreapp2.2/WebProj.Tests.dll(.NETCoreApp,Version=v2.2)
Microsoft (R) Test Execution Command Line Tool Version 16.2.0-preview-20190606-02
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
[xUnit.net 00:00:00.50]     WebProj.Tests.UnitTest1.Test1 [FAIL]
  X WebProj.Tests.UnitTest1.Test1 [5ms]
  Error Message:
   Assert.True() Failure
Expected: True
Actual:   False
  Stack Trace:
     at WebProj.Tests.UnitTest1.Test1() in /Users/ironman/dotnet-sln/WebProj.Tests/UnitTest1.cs:line 10

Test Run Failed.
Total tests: 1
     Failed: 1
 Total time: 1.2550 Seconds

接著嘗試進行 commit:

$ git commit
You should pass the testing before action

附錄 A、待敘項目

  • 簡介各個 Hook 處發的時機,最好能畫出一張流程圖
  • 用幾個常用到的 Hook 腳本作為範例

上一篇
Git Patch、Cherry-Pick、Rebase
下一篇
Git Merge
系列文
Git 其然,Git 其所以然31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言