Overcommit RailsSchemaUpToDate проходит, когда --run, но терпит неудачу, когда фиксирует

Я испытываю странную проблему с overcommit а также Rails 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 но я все еще испытываю ту же проблему.

Кто-то испытывает ту же проблему?

2 ответа

Решение

Я понял, на самом деле. Кажется, что overcommit --run выполняется для всего проекта (за исключением изменений, не подготовленных для фиксации), тогда как ловушка Pre-Commit активируется только при внесении изменений.

Я добавил все линтеры в этом коммите, я побежал bundle exec rubocop --auto-correct исключая db/schema.rb в моем .rubocop.yml для всех копов.

Это вызвало присутствие migration_files (предыдущие файлы миграции отредактированы) без schema_files (без изменений schema.rb), так:

if migration_files.any? && schema_files.none?

была найдена повышенная ошибка согласно источнику, связанному Брайаном.

По этой причине я просто зафиксировал отключение overcommit и, начиная со следующего коммита, эта ошибка больше не воспроизводилась

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

Я считаю, что разница в том, что overcommit --run смотрит на то, что уже было передано мастеру, а хук перед фиксацией смотрит на то, что ты пытаешься зафиксировать.

Глядя на источник, вы получаете сообщение об ошибке, когда if migration_files.any? && schema_files.none? правда. То есть есть файлы под db/migrate/, но нет db/schema.rb файл.

Можете ли вы показать вывод git status? Может быть, ваш db/schema.rb файл был удален как-то?

Другие вопросы по тегам