Qual è il modo preferito per gestire schema.rb in git?

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:

  1. Conservare schema.rb nel repository per l’installazione del database in fase di distribuzione
  2. Mantieni schema.rb in “.gitignore” per lo sviluppo generale

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:

    1. Esegui tutte le migrazioni in sospeso con rake db:migrate
    2. Prendendo il contenuto del tuo schema.rb nel blocco ActiveRecord::Schema.define
    3. Incollalo nella tua migrazione iniziale_schema all’interno di def up (sovrascrivendo quello che c’è già)
    4. Elimina tutte le altre migrazioni

    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.

    1. schema.rb file schema.rb .
    2. Esegui git pull (o continua con quello che stai facendo)

    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 .