# 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