OOZOU
與我們聯繫
返回 TIL 列表
ruby

在 commit 之前執行 rubocop

October 13, 2020

前言

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

  1. 安裝 Rubocop 和你選擇的 pre-commit hook 工具(例如 Husky 或 Pre-commit)。
  2. 在 .git/hooks 目錄中建立一個名為 pre-commit 的新檔案。
  3. 把 Rubocop 指令加進 pre-commit 檔案,例如 rubocop -a。
  4. 執行 chmod +x .git/hooks/pre-commit 把 pre-commit 檔案設為可執行。
  5. 執行 git commit -m “Test commit” 來測試 pre-commit hook

注意:如果你想暫時略過 pre-commit hook,可以在 git commit 指令加上 --no-verify 選項,例如 git commit -m “Test commit” --no-verify。

更多關於 ruby 的筆記

rubyApril 30, 2021

讓 Pry 支援貼上使用行首點記法的多行 Ruby 區塊

我們現在很常使用行首點記法,例如

rubyOctober 14, 2020

不含插值的 Heredoc

有時你會想使用 Ruby 的 Heredoc 但不進行插值('#{....}')。只要在你的關鍵字前後加上單引號就可以做到:

rubyOctober 13, 2020

在 Ruby 中自動建立中間層的 Hashtable

所有中間層的 hashtable 都會自動神奇地建立起來

有專案構想嗎?

我們很樂意聆聽您正在打造的產品。

開始對話hello@oozou.com
OOZOU Logo

曼谷 · 新加坡 · 香港

X
Facebook
Instagram
LinkedIn

服務

  • Web 開發
  • AI 代理人與生成式 AI
  • 行動應用開發
  • 數據分析與工程
  • UI/UX 與產品設計
  • 數位轉型

公司

  • 關於我們
  • 職涯
  • 部落格
  • 案例研究
  • Today I Learned
  • 聯繫我們

更多

  • 產業
  • 合作夥伴網絡
© 2026 OOZOU. 版權所有。
隱私政策行為準則反賄賂反貪腐政策