在 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。