52 votes

Quelle est la meilleure façon de gérer schéma.rb dans git?

Je ne veux pas ajouter schema.rb de .gitignore, parce que je veux être en mesure de charger un nouveau schéma de base de données à partir de ce fichier. Toutefois, en gardant vérifier en est à l'origine de toutes sortes de fausses conflits qui sont facilement résolus par une fraîche db:migrate:reset.

Fondamentalement, je veux un moyen de:

  1. Garder schéma.rb dans le référentiel pour l'heure de déploiement de la base de données de configuration
  2. Garder schéma.rb".gitignore' pour le développement général

Il y aurait une ou deux personnes responsables de la mise à jour de schema.rb , et sachant qu'elle était correcte.

Est-il possible que je peux avoir mon gâteau et le manger aussi?

21voto

Adam Alexander Points 10883

J'ai peur que la magie de la solution que vous cherchez n'existe pas. Ce fichier est normalement géré dans le contrôle de version, puis pour tous les conflits sur la version en ligne, il suffit de choisir la plus tardive des deux dates. Tant que vous êtes également en cours d'exécution de tous les associés migrations rien ne doit sortir de la synchronisation de cette façon. Si les deux développeurs ont provoqué des modifications dans un domaine similaire de schéma.rb et vous obtenez des conflits en plus de la version alors vous êtes confrontés à une normale de fusion de la résolution des conflits, mais à mon avis, ce sont normalement faciles à comprendre et à résoudre. J'espère que cela aide certains!

9voto

Headshota Points 11302

Une autre chose que vous pouvez faire est d'utiliser:

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

Cette volonté de conserver le fichier dans le référentiel, mais ne pas le suivi des modifications. vous pouvez changer le suivi à tout moment à l'aide de:

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

2voto

Tom Harris Points 199

Ce qui a vraiment bien fonctionné pour moi, c'est de supprimer et .gitignore schema.rb et alors il est régénéré à chaque développeur quand ils rake db:migrate.

Vous pouvez toujours obtenir ce que tu voulais sans la migration à partir de 0 et de risquer de cassé migrations y a quelques années, simplement en faisant un "roll-up" des migrations périodiquement. Vous pouvez le faire par:

  1. Exécuter tous les encours de migrations d' rake db:migrate
  2. En prenant le contenu de votre schema.rb dans la ActiveRecord::Schema.define bloc
  3. De le coller dans votre initial_schema la migration à l'intérieur d' def up (en écrasant ce qui est déjà là)
  4. Supprimer tous les autres migrations

Maintenant, votre initial_schema la migration est votre point de départ pour les nouveaux systèmes, et vous n'avez pas à vous inquiéter au sujet des conflits en schema.rb qui ne peuvent pas être résolus correctement. Ce n'est pas magique, mais il fonctionne.

1voto

Paul Points 12977

Au lieu d'utiliser .gitignore, l'utilisation des branches distinctes: Develop qui omet schema.rb et Test et Deploy incluent schema.rb. Seulement apporter des modifications de code dans le fait de Développer des branches et de ne jamais fusionner Test en Develop. Gardez schema.rb dans une branche séparée:

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

Dans Git, les branches sont des pointeurs vers des collections de contenu du fichier, de sorte qu'ils peuvent inclure ou d'exclure certains fichiers et d'effectuer le suivi des versions de fichiers. Cela fait d'eux des outils flexibles pour la construction de votre flux de travail.

1voto

andrea Points 2709

Vous pouvez définir une stratégie de fusion. J'ai trouvé cette solution, mais ne me souviens pas de la source

[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)'"

mettre ce "quelque part" et

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X