首頁 > 軟體

git hooks的作用及建立使用範例詳解

2022-08-23 18:02:06

1. 什麼是git hooks ?有什麼用啊?

1.1 是個啥

git大家都在用吧,相信現在沒公司程式碼不做版本控制的吧。git hooksgit提供的,在發生特定事件時,允許使用者新增自定義程式碼(或操作)的方式。

就像Vue中元件的生命週期勾點,比如,你想在vue元件建立後輸出一行log, 你可能會這麼寫

export default {
    created () {
        console.log('Hello I am created.')
    }
}

1.2 有啥用?我以前沒用過它不也一樣好好的嗎?我幹嘛要用它?

  • 你在git commit -m "feat: 修復bug=51234"時,總是提交的很規範,很明確自己提交了什麼,但是團隊中有人提交時只寫一個git commit -m "add",你也看不出來他提交了啥,這時候就可以使用commit-msg勾點去限定下,提交資訊必須符合某種格式,否則不允許提交
  • 你喜歡js程式碼縮排用兩個空格,但是團隊中有人總是兩個空格和四個空格混用,十分的混亂,這時候就可以結合eslint,在提交前進行程式碼格式的校驗

2. 怎麼建立一個 git hooks ?

2.1 首先看git hooks存在哪裡

git hooks其實就存在倉庫根目錄中的.git/hooks/目錄中(.git目錄可能是隱藏目錄,取消隱藏即可檢視),我們來看下預設的.git/hooks/目錄是什麼樣子

發現了嗎,git在初始化倉庫的時候,很貼心的為你初始化了很多個xxx.sample檔案(這些檔案不會被執行),就是勾點的範例檔案,比如pre-commit.sample就是git commit前的勾點範例檔案。

2.2 建立一個pre-commit勾點

為了更容易理解,讓我們設定一個場景:比如,你想在git commit 前在命令列輸出一個 Hello world

.git/hooks/中將pre-commit.sample檔案複製一份,刪除檔案字尾名,檔名變為pre-commit,刪除除第一行以外的內容

#!/bin/sh
# 以下為shell語法
echo "Hello world"

2.3 觸發勾點

我們剛剛建立的是提交前的勾點,那麼我們要觸發它,就必須得提交程式碼(即執行git commit

在根目錄中建立一個檔案 1.js

var a = 12

建立後目錄結構

study
├── .git
│   ├── hooks
│   │   ├── pre-commit
└── 1.js

新增進暫存區

git add .

提交

git commit -m "我新建了一個1.js"

此時命令列輸出

你看上面打出了 "Hello world",喲呼,我們建立了自己的第一個git hooks,給自己點個贊!!!!

3 有用點的實戰

需求場景

假設,我們不允許在提交資訊中包含"大白"這種詞彙,那麼我們可以怎麼做?

在.git/hooks 中新建commit-msg檔案, 編寫 .git/hooks/commit-msg 檔案內容

  • node版
#!/usr/bin/env node
const fs = require('fs');
// 索引 2 對應的 commit 訊息檔案 裡面包含提交資訊
// 就是你在 git commit -m "msg" 時輸入的 msg
const msg = fs.readFileSync(process.argv[2], 'utf-8').trim();
// 判斷 commit_msg中是否包含 "大白"
// 若包含,則中斷git的流程
if (msg.indexOf('大白') > -1) {
  console.error('您的提交資訊中包含【大白】這個詞彙,請檢查!');
  // exit 1 表示程式執行異常退出 中斷git的流程 不允許提交
  process.exit(1);
} else {
    console.log('不包含')
}
  • shell 版
#!/bin/sh
# 獲取當前提交的 commit msg 內容
# 就是你在 git commit -m "msg" 時輸入的 msg
# 用 `` 可以將命令的輸出結果賦值給變數 commit_msg
# $1 是git在執行勾點時提供給我們的引數,就是你在 git commit -m "msg" 時輸入的 msg
commit_msg=`cat $1`
# 輸出下獲取到的提交註釋
echo "您提交的commit_msg: $commit_msg"
# 判斷 commit_msg中是否包含 "大白"
# 若包含,則中斷git的流程
if [[ $commit_msg =~ "大白" ]]
then
  echo "您的提交資訊中包含【大白】這個詞彙,請檢查!"
  # exit 1 表示程式執行異常退出 中斷git的流程 不允許提交
  exit 1
else
  echo "不包含"
fi

修改 1.js

var a = 12333

新增進暫存區

git add .

提交

git commit -m "我新建了一個1.js,大白"

執行結果

4 總結

其實就是git就是在使用者做特定事情的時候,去查詢.git/hooks/,目錄中查詢對應事件的勾點檔案是否存在,若存在就執行這個勾點檔案中的shell指令碼(上面的例子中就是git在使用者執行git commit操作的時候,找到了pre-commit檔案並執行了其中的shell

5 其他

5.1 如果在mac下報以下異常

hint: The ‘.git/hooks/pre-auto-gc’ hook was ignored because it’s not set as executable.
hint: You can disable this warning with git config advice.ignoredHook false.

那是因為在mac下檔案預設是不可執行的,執行以下操作即可

chmod 777 .git/hooks/commit-msg

5.2 常用勾點

pre-commit 提交前
commit-msg 提交資訊
pre-push push前

更多檔案請參看點我去官網看

5.3 hooks可以使用什麼語言?

用於編寫 git hooks 的指令碼語言是沒有限制的,你可以用 nodejsshellpythonruby等指令碼語言,非常的靈活方便。文中我使用的是shell

以上就是git hooks的作用及建立使用範例詳解的詳細內容,更多關於git hooks建立使用的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com