wake-up-neo.net

Was ist die bevorzugte Methode zum Verwalten von schema.rb in git?

Ich möchte schema.rb nicht zu .gitignore hinzufügen, da ich in der Lage sein möchte, ein neues Datenbankschema aus dieser Datei zu laden. Das Einchecken verursacht jedoch alle Arten von falschen Konflikten, die leicht durch einen neuen db:migrate:reset gelöst werden können.

Grundsätzlich möchte ich einen Weg, um:

  1. Behalten Sie schema.rb im Repository für die Einrichtung der Datenbank zur Bereitstellungszeit bei
  2. Behalten Sie schema.rb für die allgemeine Entwicklung in '.gitignore'

Ein oder zwei Personen wären für die Aktualisierung von schema.rb verantwortlich und wüssten, dass dieser korrekt ist.

Kann ich meinen Kuchen auch essen?

49
Otto

Was für mich wirklich gut funktioniert hat, ist, dass ich schema.rb lösche und .gitignore und es dann für jeden Entwickler neu generiere, wenn sie rake db:migrate.

Sie können immer noch das erreichen, was Sie wollten, ohne von 0 zu migrieren und unterbrochene Migrationen von vor Jahren zu riskieren, indem Sie einfach in regelmäßigen Abständen ein "Roll-up" der Migrationen durchführen. Sie können dies tun, indem Sie:

  1. Führen Sie alle ausstehenden Migrationen mit rake db:migrate aus.
  2. Übernehmen Sie den Inhalt Ihres schema.rb im Block ActiveRecord::Schema.define
  3. Fügen Sie es in Ihre initial_schema-Migration in def up ein (überschreiben, was bereits vorhanden ist)
  4. Löschen Sie alle anderen Migrationen

Jetzt ist Ihre initial_schema-Migration Ihr Ausgangspunkt für neue Systeme und Sie müssen sich keine Sorgen mehr über Konflikte in schema.rb machen, die möglicherweise nicht richtig gelöst werden. Es ist nicht magisch, aber es funktioniert.

2
Tom Harris

Ich fürchte, die von Ihnen gesuchte magische Lösung existiert nicht. Diese Datei wird normalerweise in der Versionskontrolle verwaltet. Bei Konflikten in der Versionszeile wählen Sie einfach das spätere der beiden Daten. Solange Sie auch alle damit verbundenen Migrationen ausführen, sollte auf diese Weise nichts aus der Synchronisation geraten. Wenn zwei Entwickler Änderungen an einem ähnlichen Bereich von schema.rb vorgenommen haben und Sie zusätzlich zu der Version Konflikte feststellen, werden Sie mit einer normalen Lösung von Zusammenführungskonflikten konfrontiert. Meiner Meinung nach sind diese jedoch normalerweise leicht zu verstehen und zu lösen. Ich hoffe das hilft einigem!

21
Adam Alexander

Eine andere Sache, die Sie tun können, ist zu verwenden:

git update-index --assume-unchanged /path/schema.rb

Dadurch bleibt die Datei im Repository, es werden jedoch keine Änderungen protokolliert. Sie können das Tracking jederzeit ändern, indem Sie Folgendes verwenden:

git update-index --no-assume-unchanged /path/schema.rb
8
Headshota

Verwenden Sie anstelle von .gitignore separate Zweige: Develop, in denen schema.rb und Test sowie Deploy mit schema.rb weggelassen werden. Nehmen Sie Codeänderungen nur in den Entwicklungszweigen vor und führen Sie sie niemals von Test in Develop zusammen. Bewahren Sie schema.rb in einem separaten Zweig auf:

Developer A             
    Develop      --------             
    Local Schema          \           Your Repo
    Test                    --------->    Dev A
                            --------->    Dev B
Developer B               /               Master
    Develop      --------                 Schema
    Local Schema                          Test
    Test                                  Deploy

In Git sind Verzweigungen Zeiger auf Sammlungen von Dateiinhalten, sodass sie bestimmte Dateien einschließen oder ausschließen sowie Dateiversionen verfolgen können. Dies macht sie zu flexiblen Tools für die Erstellung Ihres speziellen Workflows.

1
Paul

Sie können eine Zusammenführungsstrategie definieren. Ich habe diese Lösung gefunden, erinnere mich aber nicht an die Quelle

[merge "railsschema"]
name = newer Rails schema version
driver = "Ruby -e '\n\
    system %(git), %(merge-file), %(--marker-size=%L), %(%A), %(%O), %(%B)\n\
    b = File.read(%(%A))\n\
    b.sub!(/^<+ .*\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n=+\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n>+ .*/) do\n\
      %(ActiveRecord::Schema.define(:version => #{[$1, $2].max}) do)\n\
    end\n\
    File.open(%(%A), %(w)) {|f| f.write(b)}\n\
    exit 1 if b.include?(%(<)*%L)'"

setzen Sie dieses "irgendwo" und

git-config --global core.attributesfile "somewhere"
1
andrea

Ich habe ein Juwel gebaut, um dieses Problem zu lösen.

Es sortiert Spalten, Indexnamen und Fremdschlüssel, entfernt überflüssige Leerzeichen und führt Rubocop für einige Formatierungen aus, um die Ausgabe Ihrer schema.rb-Datei zu vereinheitlichen.

https://github.com/jakeonrails/fix-db-schema-conflicts

Nachdem Sie es zu Ihrem Gemfile hinzugefügt haben, führen Sie einfach rake db:migrate oder rake db:schema:dump wie gewohnt aus.

1
jakeonrails

Wäre es ausreichend, einen Rake zu machen, db: dump in einem Pre-Commit Git Hook?

Das Folgende wird nicht unbedingt (1) oder (2) beheben, aber es könnte das Zusammenführungsproblem lösen und dann vielleicht (1) und (2) verschwinden.

1
dbrown0708
  1. schema.rb Datei festschreiben.
  2. Führe Git Pull aus (oder mache weiter mit dem, was du tust)

Bei jeder Migration der Datenbank wird die schema.rb-Datei aktualisiert und in git status angezeigt. Wenn Sie an etwas arbeiten und gelegentlich git pull ausführen, kann dies ärgerlich sein, da Sie vor dem Ziehen eine schema.rb-Datei festschreiben müssen, um den Konflikt zu lösen. Dies bedeutet, dass Sie bei jeder Migration der Datenbank die Datei schema.rb festschreiben müssen.

0
Chemist