Non voglio aggiungere schema.rb
a schema.rb
, perché voglio poter caricare un nuovo schema di database da quel file. Tuttavia, tenerlo archiviato causa tutti i tipi di conflitti spuri facilmente risolvibili con un nuovo db:migrate:reset
.
Fondamentalmente voglio un modo per:
Ci sarebbero state una o due persone responsabili dell’aggiornamento dello schema.rb
e sapendo che era corretto.
C’è un modo per avere la mia torta e mangiarla anch’io?
Quello che ha funzionato molto bene per me è eliminare e schema.rb
e poi schema.rb
rigenerare per ogni sviluppatore quando eseguono il rake db:migrate
.
È ancora ansible ottenere ciò che si desidera senza migrare da 0 e rischiare di migrare da migrazioni di anni fa semplicemente effettuando un “roll-up” delle migrazioni periodicamente. Puoi farlo da:
rake db:migrate
schema.rb
nel blocco ActiveRecord::Schema.define
def up
(sovrascrivendo quello che c’è già) Ora la tua migrazione initial_schema è il punto di partenza per i nuovi sistemi e non devi preoccuparti dei conflitti in schema.rb
che potrebbero non essere risolti correttamente. Non è magico, ma funziona.
Ho paura che la soluzione magica che stai cercando non esista. Questo file viene normalmente gestito nel controllo della versione, quindi per eventuali conflitti sulla versione della linea è sufficiente scegliere la successiva delle due date. Finché eseguirai anche tutte le migrazioni associate, niente dovrebbe uscire dalla sincronizzazione in questo modo. Se due sviluppatori hanno causato modifiche a un’area simile di schema.rb e si verificano conflitti in aggiunta alla versione, si ha a che fare con una normale risoluzione di conflitto di unione, ma a mio avviso questi sono normalmente facili da comprendere e risolvere. Spero che questo aiuti alcuni!
Un’altra cosa che puoi fare è usare:
git update-index --assume-unchanged /path/schema.rb
Ciò manterrà il file nel repository ma non traccerà le modifiche. puoi cambiare il monitoraggio in qualsiasi momento usando:
git update-index --no-assume-unchanged /path/schema.rb
Sarebbe sufficiente fare un rake db: dump in un hook git pre-commit?
Quanto segue non necessariamente corregge (1) o (2), ma potrebbe occuparsi del problema della fusione, e quindi forse (1) e (2) andare via.
Invece di usare .gitignore
, usa branch separati: Develop
che omette schema.rb
e Test
and Deploy
che include schema.rb
. Esegui solo modifiche al codice nei rami Sviluppo e non unisci mai da Test
in Develop
. Mantieni schema.rb
in un ramo separato:
Developer A Develop -------- Local Schema \ Your Repo Test ---------> Dev A ---------> Dev B Developer B / Master Develop -------- Schema Local Schema Test Test Deploy
In Git, i rami sono puntatori a raccolte di contenuti di file, in modo che possano includere o escludere determinati file e tenere traccia delle versioni dei file. Questo li rende strumenti flessibili per build il tuo particolare stream di lavoro.
È ansible definire una strategia di unione. Ho trovato questa soluzione, ma non ricordo la fonte
[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)'"
metti questo "da qualche parte" e
git-config --global core.attributesfile "somewhere"
Ho costruito una gem per risolvere questo problema.
Ordina le colonne, i nomi degli indici e le chiavi esterne, rimuove gli spazi bianchi in eccesso ed esegue Rubocop per alcune formattazioni per unificare l’output del file schema.rb.
https://github.com/jakeonrails/fix-db-schema-conflicts
Dopo averlo aggiunto al tuo Gemfile, esegui rake db:migrate
o rake db:schema:dump
come al solito.
schema.rb
file schema.rb
. Ogni volta che si schema.rb
la migrazione del database, il file schema.rb
aggiorna e viene visualizzato in git status
. Quando si lavora su qualcosa e occasionalmente si esegue git pull
, questo può essere fastidioso perché devi impegnare il file schema.rb
prima di estrarre il conflitto. Ciò significa che ogni volta che si schema.rb
la migrazione del database, è necessario impegnare il file schema.rb
.