在 commit 之前執行 rubocop
前言
Git hooks 對於在 Git repository 中自動化任務、落實程式碼規範來說非常強大。Git hooks 的一個常見用途,就是在允許 commit 之前先執行自動化測試和程式碼分析工具。這篇文章會介紹 pre-commit hook、如何略過它,以及如何設定一個 pre-commit hook 來執行 Rubocop 這個 Ruby 程式碼分析工具。
什麼是 Rubocop?
Rubocop 是 Ruby 的靜態程式碼分析工具,會檢查程式碼的風格與安全性問題。它在 Ruby 開發者之間相當受歡迎,用來確保程式碼遵循 Ruby style guide 和最佳實務。Rubocop 可以手動執行,但把它整合進 pre-commit hook,就能確保每次 commit 之前程式碼都會自動被檢查。
把下面的內容複製到 .git/hooks/pre-commit(移除 .sample)
#!/usr/bin/env ruby
require 'english'
require 'rubocop'
ADDED_OR_MODIFIED = /A|AM|^M/.freeze
changed_files = `git status --porcelain`.split(/\n/).
select { |file_name_with_status|
file_name_with_status =~ ADDED_OR_MODIFIED
}.
map { |file_name_with_status|
file_name_with_status.split(' ')[1]
}.
select { |file_name|
File.extname(file_name) == '.rb'
}.join(' ')
system("rubocop #{changed_files}") unless changed_files.empty?
exit $CHILD_STATUS.exitstatus
把它設為可執行
$ chmod +x .git/hooks/pre-commit
這樣就完成了,從現在開始它會對你的變更執行 rubocop,除非你修正這些 offence,否則就無法 commit。
要怎麼略過 pre-commit?只要在 git commit 加上 -n 就行
$ git commit -n -m "[hotfix] blah blah"
什麼是 pre-commit hook?
pre-commit hook 是一種在建立 commit 之前執行的 client 端 Git hook。它是一段腳本,可以做各種事情,例如執行自動化測試、檢查程式碼風格或落實程式碼規範。如果 pre-commit hook 失敗,commit 就會被中止,你必須先修正問題才能再次 commit。
為什麼要在 commit 之前執行 Rubocop
在 commit 之前執行 Rubocop 有幾個好處:
- 程式碼品質:Rubocop 會檢查程式碼的風格與安全性問題,讓整個 codebase 保持一致且安全。
- 節省時間:在 commit 之前自動執行 Rubocop,可以及早發現問題,避免之後浪費時間除錯。
- 團隊協作:透過 pre-commit hook 落實程式碼規範,能促進團隊成員之間的協作與一致性。
如何設定 pre-commit hook
- 安裝 Rubocop 和你選擇的 pre-commit hook 工具(例如 Husky 或 Pre-commit)。
- 在 .git/hooks 目錄中建立一個名為 pre-commit 的新檔案。
- 把 Rubocop 指令加進 pre-commit 檔案,例如 rubocop -a。
- 執行 chmod +x .git/hooks/pre-commit 把 pre-commit 檔案設為可執行。
- 執行 git commit -m “Test commit” 來測試 pre-commit hook
注意:如果你想暫時略過 pre-commit hook,可以在 git commit 指令加上 --no-verify 選項,例如 git commit -m “Test commit” --no-verify。