Overcommit RailsSchemaUpToDate 在 --run 时通过,但在提交时失败



我在overcommitRails 5.0.2应用程序上遇到了一个奇怪的问题,ruby 2.4.0

$ overcommit --run
Running pre-commit hooks
Check if database schema is up to date..........[RailsSchemaUpToDate] OK
Check YAML syntax........................................[YamlSyntax] OK
Check Gemfile dependencies..............................[BundleCheck] OK
Check for vulnerable versions of gems...................[BundleAudit] OK
Analyze with RuboCop........................................[RuboCop] OK
Analyze with haml-lint.....................................[HamlLint] OK
✓ All pre-commit hooks passed
$ git ci -m "Overcommit and Linters added"
Running pre-commit hooks
Check if database schema is up to date..........[RailsSchemaUpToDate] FAILED
It looks like you're adding a migration, but did not update the schema file
Check YAML syntax........................................[YamlSyntax] OK
Check Gemfile dependencies..............................[BundleCheck] OK
Check for vulnerable versions of gems...................[BundleAudit] OK
Analyze with RuboCop........................................[RuboCop] OK
Analyze with haml-lint.....................................[HamlLint] OK
✗ One or more pre-commit hooks failed

这是我Gemfile的相关部分:

group :lint do
gem 'overcommit', '~> 0.41', require: false  # hook event pre-commit, pre-push
gem 'brakeman', '~> 3.7.2', require: false  # A static analysis security vulnerability scanner
gem 'haml-lint', '~> 0.26', require: false  # Syntax checker for HAML
gem 'ruby_css_lint', '~> 0.1', require: false  # Syntax checker for CSS
gem 'rubocop', '~> 0.50', require: false  # A Ruby static code analyzer
gem 'bundler-audit', '~> 0.6'  # Check dependencies
end

在我的.overcommit.yml中,我有:

PreCommit:
ALL:
exclude:
- 'bin/**'
- 'public/**'
- 'vendor/**'
# ...
# Migration Check
RailsSchemaUpToDate:
enabled: true
on_warn: fail

我的数据库文件夹结构为:

+-- db
| +-- seeds.rb
| +-- migrate
| +-- 20170922082256_devise_create_users.rb
| +-- 20170922084050_create_fans.rb
| +-- schema.rb

这是我db/schema.rb的相关部分:

ActiveRecord::Schema.define(version: 20170922084050) do
# ...
end

我试图降级到ruby 2.3.1但我仍然遇到同样的问题。

有人遇到同样的问题吗?

我实际上想通了。 似乎overcommit --run针对整个项目运行(除了未暂存的更改),而预提交钩子仅在要提交的更改时触发。

我在那次提交中添加了所有的棉绒,我运行了bundle exec rubocop --auto-correct,排除了所有警察.rubocop.yml中的db/schema.rb

这导致存在没有schema_filesmigration_files(以前的迁移文件已编辑)schema.rb),因此:

if migration_files.any? && schema_files.none?

根据布莱恩链接的来源发现提出了错误。

出于这个原因,我刚刚承诺禁用过度提交,从下一次提交开始,此错误不再重现

$ OVERCOMMIT_DISABLED=1 git ci -m "Overcommit and Linters added"

我相信区别在于overcommit --run正在查看已经提交到master的内容,而预提交钩子正在查看您尝试提交的内容。

查看源,当if migration_files.any? && schema_files.none?为真时,将显示您收到的错误消息。也就是说,db/migrate/下有文件,但没有db/schema.rb文件。

你能显示git status的输出吗?也许您的db/schema.rb文件以某种方式被删除了?

最新更新