pre-commit 是一套相當方便的 Git pre-commit hooks 工具,除了內建不少好用的程式碼檢查工具之外,也同時支援 Python, Ruby, Swift, Go, Nodejs 等熱門程式語言,更能夠利用其框架(framework)針對自己的需求開發 pre-commit hooks 。
這麼好用的工具怎能不裝來使用呢!
一起利用 pre-commit 改善我們的程式碼品質吧!
本文環境
- Python 3.8.1
- pre-commit 2.21.0
安裝(Installation)
pre-commit 是利用 Python 所開發的工具,因此安裝 pre-commit
只需要透過 Python 套件管理工具 pip 即可:
$ pip install pre-commit
設定 .pre-commit-config.yaml
pre-commit
是在執行 git commit
指令時會跟著運作的指令,所以必須在 git 專案中添加 .pre-commit-config.yaml
設定檔,讓 pre-commit
知道要執行哪些 hooks 。
所以 .pre-commit-config.yaml
設定檔會跟 .git/
同一層,例如:
.
├── README.md
├── requirements.txt
├── .git
├── .pre-commit-config.yaml
└── project/
.pre-commit-config.yaml
設定檔的內容可以使用以下指令產生:
$ pre-commit sample-config > .pre-commit-config.yaml
成功執行的話,可以打開 .pre-commit-config.yaml
檔案看看:
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
接著說明上述設定檔的內容。
由於 pre-commit 將各種 hooks 存放在另外的 GitHub repository pre-commit-hooks ,因此能夠看到 .pre-commit-config.yaml
中設定為 repo: https://github.com/pre-commit/pre-commit-hooks
。
而我們所指定的 repo 版本為 v3.2.0
,對應的即是 https://github.com/pre-commit/pre-commit-hooks/releases 中的版本號,原則上只要用最新的版本號即可。
最後是透過 hooks 設定要啟用的功能,唯一必填的設定為 id
,這些 id
可以在此文件中找到相對應的 id 與說明,大家可以閱讀各個功能的說明,並且挑選合用的 hooks 。
簡單說明一下,上述設定檔中的 4 個 hooks 的作用:
trailing-whitespace
去除每行結尾的空白end-of-file-fixer
確保每個檔案最後 1 行是空行check-yaml
檢查 repo 中的 yaml 檔格式是否正確check-added-large-files
防止大檔案被 commit 進 repo
如果是 Python 的開發者,可以使用以下設定(啟用 flake8 的檢查):
- repo: https://github.com/PyCQA/flake8
rev: 6.0.0
hooks:
- id: flake8
p.s. 請記得安裝 flake8
關於 hooks 更詳細的設定可以參閱 .pre-commit-config.yaml - hooks 。
安裝 pre-commit hooks
完成 .pre-commit-config.yaml
設定檔之後,需要用以下指令安裝 pre-commit hooks 到 Git ,如此才能讓 pre-commit hooks 發揮作用:
$ pre-commit install --install-hooks
試著隨便改幾個檔案,並執行 git commit -m 'test pre-commit'
看看是否會出現類似以下的訊息:
$ git cim 'test pre-commit'
Trim Trailing Whitespace.................................................Passed
Flake8...................................................................Passed
[master 1234567] test pre-commit
2 files changed, 2 insertions(+), 1 deletion(-)
如果有出現類似以上的訊息就是成功囉!
幫忙偵測金鑰、密碼被 commit 的 pre-commit hooks
開發時,還有一種常見的錯誤——「將金鑰、密碼 commit」,這會導致金鑰與密碼有洩漏的風險!
最好的方法是使用 Gitleaks 或者類似工具,安裝到 pre-commit 之中。
其設定寫法為:
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.16.1
hooks:
- id: gitleaks
如此一來,就可以在 commit 金鑰、密碼之前事先阻擋避免錯誤發生!
總結
pre-commit 是一個相當實用的套件,可以有效增進 codebase 的品質,實際上,個人是將 pre-commit 整合在 GitHub Actions, 如果有隊友開了新的分支或 push commit, GitHub Actions 就會自動執行 pre-commit 進行檢查,如果檢查不通過就無法進主線。
大家也可以透過類似方式打造適合自己或團隊的 pre-commit 流程,達到保護他人也保護主線的目的。
以上是關於 pre-commit 的介紹!
Happy Coding!
References
https://pre-commit.com/