Должен ли я добавлять файлы миграции Django в.файл gitignore?


должен ли я добавлять файлы миграции Django в ?

в последнее время я получаю много проблем git из-за конфликтов миграции и задавался вопросом, должен ли я отмечать файлы миграции как игнорируемые.

Если да, то как бы я мог добавить все миграции, которые у меня есть в моих приложениях, и добавить их в ?

9 73

9 ответов:

слово документация по миграции Django:

файлы миграции для каждого приложения живут в каталоге "миграции" внутри этого приложения и предназначены для фиксации и распространения как часть его кодовой базы. Вы должны сделать их один раз на своей машине разработки, а затем выполнить те же миграции на машинах ваших коллег, ваших промежуточных машинах и, в конечном итоге, на ваших производственных машинах.

Если вы будете следовать этот процесс, вы не должны получать какие-либо конфликты слияния в файлах миграции.

чтобы устранить любые проблемы, которые у вас есть в настоящее время, вы должны указать, какой репозиторий или филиал имеет авторитетную версию файлов миграции, а затем использовать механизм атрибутов git чтобы указать стратегию слияния "наши" для этих файлов. Это позволит git всегда игнорировать внешние изменения в этих файлах и предпочесть локальную версию.

нет.

Я был над этим много раз, и я не могу, для жизни меня, найти случай, когда нам нужны миграции в репо.

как я вижу, окончательная Запись Схемы models.py. Если я сливаю изменения и кто-то другой тянет его, все будет правильно, когда они запускаются makemigrations и migrate. Нет необходимости определять, какова стратегия" наших " для миграций.

если нам нужно откатиться, то мы возвращаемся models и перенести. Все хорошо, нет проблемы, никогда.

нет жалоб на то, что поле уже существует и т. д.

интересно, может ли кто-нибудь дать мне конкретный случай, когда мне выгодно объединить файлы миграции другого разработчика, прежде чем я смогу приступить к работе. Я знаю, что доктора говорят, что я должен, поэтому я предполагаю, что это так. Но я никогда не встречал ни одного.

кого?

вы можете следовать ниже процесса.

вы можете запустить makemigrations локально и это создает файл миграции. Зафиксируйте этот новый файл миграции в репо.

по-моему тебе не стоит бегать makemigrations в производстве. Вы можете запустить migrate в производстве, и вы увидите, что миграции применяются из файла миграции, который вы зафиксировали из локального. Таким образом, вы можете избежать всех конфликтов.

В МЕСТНОМ ENV, чтобы создать миграции файлы

python manage.py makemigrations 
python manage.py migrate

теперь совершать эти вновь созданные файлы, что-то вроде ниже.

git add app/migrations/...
git commit -m 'add migration files' app/migrations/...

В ПРОИЗВОДСТВЕ ENV, выполните только следующую команду.

python manage.py migrate

цитата из документов 2018 года, Django 2.0. (две отдельные команды = makemigrations и migrate)

причина, по которой существуют отдельные команды для создания и применения миграции-это потому, что вы будете совершать миграции в свой контроль версий системы и отправить их с вашим приложением, они не только сделают ваш разработка проще, они также могут быть использованы другими разработчиками и в производство.

https://docs.djangoproject.com/en/2.0/intro/tutorial02/

local миграция (удаленная была запущена другими разработчиками и, возможно, в производстве) до N+1.

во время разработки можно было бы просто не совершать миграции (не добавляйте игнорирование, просто не add них). Но как только вы войдете в производство, вы будете они нужны для того, чтобы держать схему в синхронизации с изменениями модели.

затем вам нужно отредактировать файл и изменить dependencies до последней удаленной версии.

это работает для миграции Django, а также других подобных приложений (sqlalchemy+alembic, RoR и т. д.).

Я не могу представить почему у вас будут конфликты, если вы не редактируете миграции каким-то образом? Это обычно заканчивается плохо - если кто-то пропустит некоторые промежуточные коммиты, то они не будут обновляться с правильной версии, и их копия базы данных будет повреждена.

процесс, который я следую, довольно прост-всякий раз, когда вы меняете модели для приложения, вы также совершаете миграцию, а затем , что миграция не меняет - Если вы нужно что-то другое в модели, затем вы меняете модель и совершаете новую миграцию вместе с вашими изменениями.

в проектах greenfield вы часто можете удалить миграции и начать с нуля с помощью миграции 0001_ при выпуске, но если у вас есть производственный код, то вы не можете (хотя вы можете раздавить миграции в один).

кажется, что вам нужно будет настроить свой git рабочий процесс, вместо того, чтобы игнорировать конфликты.

в идеале, каждая новая функция разрабатывается в другой ветке, и слился обратно с pull request.

PR не может быть объединен, если есть конфликт, поэтому кому нужно объединить его функцию, необходимо разрешить конфликт, включая миграции.

короткий ответ: Я предлагаю исключить миграции в репо. После слияния кода, просто запустите ./manage.py makemigrations и все готово.

ответ Я не думаю, что вы должны помещать файлы миграции в репо. Это испортит миграционные состояния в среде разработки другого человека и другой среде prod и stage. (см. комментарий сахарного Тана для примеров).

на мой взгляд, цель миграции Django-найти пробелы между предыдущие состояния модели и новые состояния модели, а затем сериализовать разрыв. Если ваша модель изменяется после слияния кода, Вы можете просто сделать makemigrations чтобы узнать разрыв. Почему вы хотите вручную и тщательно объединить другие миграции, когда вы можете достичь того же автоматически и без ошибок? документация Django говорит,

Они*(миграции) * ’предназначены в основном для автоматического

; пожалуйста, держите его таким образом. Чтобы объединить миграции вручную, необходимо надо в полной мере понимать, что изменили другие и какая зависимость от этих изменений. Это много накладных расходов и ошибок. Таким образом, файл отслеживания моделей достаточно.

это хорошая тема для рабочего процесса. Я открыт для других вариантов.

имея кучу файлов миграции в git грязно. Существует только один файл в папке миграции, который вы не должны игнорировать. Этот файлinit. py file, если вы его проигнорируете, python больше не будет искать подмодули внутри каталога, поэтому любые попытки импортировать модули будут неудачными. Таким образом, вопрос должен заключаться в том, как игнорировать все файлы миграции, но init.py? Решение: Добавить '0*.пы' для .gitignore файлы и он делает эту работу отлично.

надеюсь, это кому-то поможет.