it-swarm.com.de

Verwalten von Konflikten in schema.rb, die durch die Git-Operation erstellt wurden

Ich habe eine Migration erstellt, rake db:migrate ausgeführt, die meine Versionsnummer für db/schema.rb gestoppt hat. Dann machte ich einen git fetch Origin master und sah von meinen Teammitgliedern Änderungen. Also habe ich einen git stash und einen git rebase FETCH_HEAD gemacht, gefolgt von einem git stash pop. Dies führte zu einem Konflikt in db/schema.rb bezüglich der Versionsnummer. 

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

Ich denke, das geeignete Update wäre, die Versionsnummer manuell auf etwas höher als den Upstream zu erhöhen.

Ist das vernünftig oder eine schlechte Nachricht?

Danke, Max

51
maxenglander

Wenn Ihre aktuelle Datenbank das richtige Schema aufweist, sollten Sie:

  • Ausführen ausstehender Migrationen (falls vorhanden)

    rake db:migrate
    
  • Überschreiben Sie Ihren schema.rb aus Ihrem aktuellen Datenbankschema

    rake db:schema:dump
    
  • Und begehen

87
Wizard of Ogz

Wenn ich mich in diesem Konflikt befinde, migriere ich einfach die Datenbank. Ob nun ausstehende Migrationen anstehen oder nicht, der Konflikt wird korrigiert.

18
Sean McMills

Nach dieser Antwort ist ein Konflikt garantiert. Der Benutzer muss manuell zusammenführen und die Version als die höhere von beiden festlegen.

7
lulalala

Wenn ich master mit meinem Feature-Zweig zusammenfühle, werden Konflikte in db/schema.rb fehlgeschlagen:

$ 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
2
Mark Kreyman

~/bin/update-schema-rb:

#!/usr/bin/env bash

git co master
bin/rake db:reset db:seed
git co -
bin/rake db:migrate
1
Dorian

Ich denke, der beste Ansatz ist, rake db:drop db:create db:migrate zu verwenden, um das Schema mithilfe von Migrationen zu regenerieren, die nur im aktuellen Zweig vorhanden sind. Auf diese Weise gelangen Migrationen aus anderen Zweigen nicht in Ihre Schemadatei und bereiten später Kopfschmerzen - falls Sie die Zweige häufig wechseln.

0
Dr.Strangelove

tldr

Akzeptieren Sie die Upstream-Version und führen Sie rake db:migrate wie gewohnt aus.

warum ist das der Weg zu gehen

Machen Sie sich keine Sorgen über die erstellten Migrationen (die sich unterhalb der Upstream-Version 20110930179257 befinden). ActiveRecord verwendet eine Tabelle schema_migrations, in der alle durchgeführten Migrationen abgelegt werden. Wenn sich Ihre Migrationen nicht in der Liste, sondern im Verzeichnis db/migrate befinden, werden sie von ActiveRecord ausgeführt. 

Hier ist die Tabelle, damit Sie sie besser visualisieren können:  schema_migrations table

Es ist verlockend zu glauben, dass es sich tatsächlich um die folgende Zeile handelt: ActiveRecord::Schema.define(:version => 20110930179257)___, die den letzten Migrationslauf definiert, sodass keine Migrationen mit darunter liegender Version ausgeführt werden. Das stimmt zum Glück nicht. Rails führt alle Migrationen aus, die sich im Ordner db/migrate und noch nicht in der Tabelle schema_migrations befinden.

0
Adam Sibik

Eine Option ist ein Skript für die manuelle Version, das nur additiv ist. Da willst du Konflikte. Schema ist etwas, das Sie hart beißen wird, wenn Sie nicht den Überblick behalten. Einmal gebissen, zweimal schüchtern, habe ich nichts dagegen, Schema- und Nachschlageinformationen (Liste der Kundentypen) mit einem einzigen Änderungsverwaltungsschema beizubehalten.

0
Adam Dymitruk