---
title: "在 commit 之前執行 rubocop"
description: "Git hooks 對於在 Git repository 中自動化任務、落實程式碼規範來說非常強大。Git hooks 的一個常見用途，就是在允許 commit 之前先執行自動化測試和程式碼分析工具…"
canonical: https://oozou.com/til/run-rubocop-before-commit-8
locale: zh-Hant
date: 2020-10-13
topic: ruby
---

# 在 commit 之前執行 rubocop

> Git hooks 對於在 Git repository 中自動化任務、落實程式碼規範來說非常強大。Git hooks 的一個常見用途，就是在允許 commit 之前先執行自動化測試和程式碼分析工具…

Published: 2020-10-13 · Topic: [ruby](https://oozou.com/zh-Hant/til-topics/ruby) ([markdown](https://oozou.com/zh-Hant/til-topics/ruby.md))

# 前言

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）

```ruby
#!/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。***

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/zh-Hant/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
