pre-commit 是一套相當方便的 Git pre-commit hooks 工具,除了內建不少好用的程式碼檢查工具之外,也同時支援 Python, Ruby, Swift, golang, node 等熱門程式語言,更能夠在其所提供的框架(framework)針對自己的需求開發 pre-commit hooks 。

這麼好用的工具怎能不裝來使用呢!

一起利用 pre-commit 改善我們的程式碼品質吧!

本文環境

  • Python 3.6.5
  • pre-commit 2.5.1

安裝(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 最簡單的設定如下,該設定會把每一行結尾的空格刪去,讓程式碼可以維持整潔:

-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.1.0
    hooks:
    -   id: trailing-whitespace

如果是 Python 的開發者,可以使用以下設定(啟用 flake8 的檢查):

-   repo: https://gitlab.com/pycqa/flake8
    rev: '3.8.3'
    hooks:
    -   id: flake8

p.s. 請記得安裝 flake8

接著說明上述設定檔的內容。

由於 pre-commit 將各種 hooks 存放在另外的 Github repository 中 pre-commit-hooks ,因此能夠看到 .pre-commit-config.yaml 中設定為 repo: https://github.com/pre-commit/pre-commit-hooks

而我們所指定的 repo 版本為 v3.1.0 ,對應的即是 https://github.com/pre-commit/pre-commit-hooks/releases 中的版本號,原則上只要用最新的版本號即可。

最後是透過 hooks 設定要啟用的功能,唯一必填的設定為 id ,這些 id 可以在 https://github.com/pre-commit/pre-commit-hooks/blob/master/.pre-commit-hooks.yaml 找到,大家可以閱讀各個功能的說明,並且挑選合用的 hooks 。

關於 hooks 更詳細的設定可以參閱 文件

安裝 pre-commit hooks

完成 .pre-commit-config.yaml 設定檔之後,用以下指令安裝 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(-)

如果有出現類似以上的訊息就是成功囉!

References

https://pre-commit.com/