---
title: "在 commit 之前运行 rubocop"
description: "Git hooks 对于在 Git repository 中自动化任务、落实代码规范来说非常强大。Git hooks 的一个常见用途，就是在允许 commit 之前先运行自动化测试和代码分析工具…"
canonical: https://oozou.com/til/run-rubocop-before-commit-8
locale: zh-Hans
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-Hans/til-topics/ruby) ([markdown](https://oozou.com/zh-Hans/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-Hans/contact

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