Я думаю, что подход Дэвида Сулька - единственный, который гарантирует, что вы избегаете запросов, проходящих, когда приложение находится в нерабочем состоянии.
Это немного болезненно, но может быть необходимо в некоторых обстоятельствах.
Как он заявил, требуется, чтобы миграция БД была неразрушающей.
Однако может быть сложно подтолкнуть ваши миграции и изменения схемы до остальной части кода, поскольку очевидный подход ('git push heroku {revnum}') полагается на то, что вы проверили миграции доостальная часть кода.
Если вы этого не сделали, все еще возможно сделать это, используя временную ветвь:
Создать ветку, основанную наgit revision, которую вы недавно добавили в heroku:
git branch <branchname> <revnum-or-tag>
Проверьте эту ветку:
git checkout <branchname>
Если ваша миграция БД фиксируетсятолько содержит миграции, и без изменений кода, cherry-pick коммиты, которые содержат изменения базы данных:
git cherry-pick <revnum1> <revnum2>...
Если вы зафиксировали изменения своей базы данных в ревизиях, которые также содержали изменения кода, выможет использовать 'git cherry-pick -n', который не будет автоматически фиксироваться;используйте 'git reset HEAD', чтобы удалить файлы, которые не изменились в БД, из набора вещей, которые будут зафиксированы.Как только вы получите только изменения в БД, передайте их во временную ветку.
git cherry-pick -n <revnum1> <revnum2>...
git reset HEAD <everything that's modified except db/>
git status
... check that everything looks ok ...
git commit
Переместите эту временную ветку в heroku (в идеале, в промежуточное приложение, чтобы проверить, что выПравильно, так как избегать простоев - вот и весь смысл прыгать через эти обручи)
git push heroku <branchname>:master
Запустить миграцию
heroku run rake db:migrate
В этот момент вы можете подумать, что можете просто нажать «master» на heroku, чтобы передать изменения кода.Тем не менее, вы не можете, так как это не быстрое слияние.Чтобы продолжить, нужно объединить оставшуюся часть 'master' во временную ветвь, а затем снова объединить ее с master, которая объединит истории фиксации двух веток:
git checkout <branchname>
git merge master
git diff <branchname> master
... shouldn't show any differences, but just check to be careful ...
git checkout master
git merge <branchname>
Теперь вы можете нажать master на heroku как обычно, что приведет к остальным изменениям кода.
На втором шаге я не уверен на 100%объединение мастера с {branchname} необходимо.Выполнение этого должно гарантировать слияние «быстрой перемотки вперед», что делает git счастливым, когда вы нажимаете на heroku, но можно получить тот же результат, просто объединяя {branchname} и master без этого шага.
Конечно, если вы не используете 'master', подставьте соответствующее название ветки в соответствующие места выше.