Управление конфликтом в schema.rb, созданном операцией Git

Я создал миграцию, запустил rake db:migrate, что привело 9X_migration к увеличению номера моей версии db / schema.rb. Затем 9X_git-commands я сделал git fetch origin master и увидел, что члены моей команды 9X_ror внесли изменения. Итак, я сделал git stash и git rebase FETCH_HEAD, за 9X_ruby-on-rails которыми следовал git stash pop. Это привело к конфликту 9X_migrations в db / schema.rb из-за номера версии.

Upstream>>> ActiveRecord::Schema.define(:version => 20110930179257) do =========== ActiveRecord::Schema.define(:version => 20110930161932) do <<

Я думаю, что 9X_rails подходящим исправлением было бы вручную 9X_ruby-on-rails увеличить номер версии до значения, превышающего 9X_ror исходный.

Это разумная новость или плохая 9X_ruby-on-rails новость?

Спасибо, Макс

61
1

  • Чтобы ответить на мой собственный вопрос, увеличивать но ...
6
Общее количество ответов: 6

Ответ #1

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

Если ваша текущая база данных имеет правильную 9X_ruby-on-rails схему, вам следует:

  • Запустить отложенные 9X_git миграции (если есть)

    rake db:migrate 
  • Перезаписать schema.rb из текущей 9X_migration схемы базы данных

    rake db:schema:dump 
  • И зафиксировать

96
2

  • Разве это не приведет к созданию запроса на перенос без изменения версии в schema.rb, если версия удаленн ...

Ответ #2

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

Когда я сталкиваюсь с этим конфликтом, я 9X_git просто переношу базу данных. Независимо 9X_git от того, есть ли незавершенные миграции 9X_migration или нет, конфликт будет исправлен.

22
0

Ответ #3

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

tldr

Примите исходную версию и запустите rake db:migrate, как 9X_git обычно.

Почему именно так?

Не беспокойтесь о созданных вами 9X_ruby-on-rails миграциях (которые ниже исходной версии 9X_git 20110930179257). ActiveRecord использует таблицу schema_migrations, куда 9X_git помещает все выполненные миграции. Если 9X_migration ваших миграций нет в списке, но они находятся 9X_git-commands в каталоге db/migrate, ActiveRecord запустит их.

Вот 9X_git-commands таблица, чтобы вы могли лучше ее визуализировать: 9X_Управление конфликтом в schema.rb, созданном операцией Git_migration

Заманчиво 9X_migrations думать, что это на самом деле такая строка: ActiveRecord::Schema.define(:version => 20110930179257) который 9X_ruby-on-rails определяет последний запуск миграции, поэтому 9X_git-commands никакие миграции с версией ниже не будут 9X_git выполняться. К счастью, это не так. Rails 9X_git выполнит любые миграции, которые находятся 9X_rails в папке db/migrate и еще не находятся в таблице schema_migrations.

17
0

Ответ #4

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

Согласно this answer, конфликт гарантирован. Пользователь 9X_ruby-on-rails должен вручную объединить и установить версию 9X_migration как более высокую из двух.

7
0

Ответ #5

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

Вот что я делаю, когда слияние мастера с 9X_migrations моей функциональной веткой дает сбой из-за 9X_rails конфликтов в db / schema.rb:

$ git merge --abort $ git checkout master $ rake db:drop db:create db:migrate $ git checkout -- db/schema.rb $ git checkout my_feature_branch $ rake db:migrate $ git add db/schema.rb $ git commit -m 'Updated schema' $ git merge master 

3
0

Ответ #6

Ответ на вопрос: Управление конфликтом в schema.rb, созданном операцией Git

~/bin/update-schema-rb:

#!/usr/bin/env bash git co master bin/rake db:reset db:seed git co - bin/rake db:migrate 

9X_ruby-on-rails

1
0