我应该在.gitignore文件中添加Django迁移文件吗?
由于迁移冲突,我最近遇到了很多git问题,我想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何去添加所有的迁移,我在我的应用程序,并将它们添加到.gitignore文件?
我应该在.gitignore文件中添加Django迁移文件吗?
由于迁移冲突,我最近遇到了很多git问题,我想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何去添加所有的迁移,我在我的应用程序,并将它们添加到.gitignore文件?
当前回答
提交迁移只会导致灾难。因为迁移在某种程度上是一条可以追溯的链,如果你有来自以前迁移的依赖,例如pip模块,你在项目生命周期的某个时刻使用过,然后停止使用。您可能会在迁移线程中发现这样的依赖关系,并且必须手动从迁移文件中删除这些导入。
结论,除非你是Django的神级开发者,否则最好避免在提交时添加迁移。
其他回答
您可以遵循以下流程。
您可以在本地运行makemigrations,这将创建迁移文件。将这个新的迁移文件提交到repo。
在我看来,你根本不应该在生产中进行大规模移民。您可以在生产环境中运行migrate,您将看到从本地提交的迁移文件应用了迁移。这样可以避免所有的冲突。
在LOCAL ENV中,要创建迁移文件,
python manage.py makemigrations
python manage.py migrate
现在提交这些新创建的文件,如下所示。
git add app/migrations/...
git commit -m 'add migration files' app/migrations/...
在PRODUCTION ENV中,只执行以下命令。
python manage.py migrate
您应该将迁移视为数据库模式的版本控制系统。Makemigrations负责将模型更改打包到单独的迁移文件中(类似于提交),migrate负责将这些文件应用到数据库中。
每个应用程序的迁移文件都存在于该应用程序内部的“migrations”目录中,并被设计为提交并作为其代码库的一部分分发。您应该在您的开发机器上进行一次迁移,然后在您同事的机器、登台机器以及最终的生产机器上运行相同的迁移。
黄金法则:在开发中只做一次,然后移植到所有开发中
提交迁移只会导致灾难。因为迁移在某种程度上是一条可以追溯的链,如果你有来自以前迁移的依赖,例如pip模块,你在项目生命周期的某个时刻使用过,然后停止使用。您可能会在迁移线程中发现这样的依赖关系,并且必须手动从迁移文件中删除这些导入。
结论,除非你是Django的神级开发者,否则最好避免在提交时添加迁移。
引用Django迁移文档:
每个应用程序的迁移文件都存在于该应用程序内部的“migrations”目录中,并被设计为提交并作为其代码库的一部分分发。您应该在您的开发机器上进行一次迁移,然后在您同事的机器、登台机器以及最终的生产机器上运行相同的迁移。
如果您遵循这个过程,您应该不会在迁移文件中遇到任何合并冲突。
当合并版本控制分支时,您仍然可能遇到基于同一个父迁移的多个迁移的情况,例如,如果不同的开发人员同时引入了一个迁移。解决这种情况的一种方法是引入merge_migration。这通常可以通过命令自动完成
./manage.py makemigrations --merge
这将引入一个新的迁移,它依赖于所有当前的头部迁移。当然,这只在头部迁移之间没有冲突的情况下才有效,在这种情况下,您必须手动解决问题。
鉴于这里有些人建议您不应该将您的迁移提交给版本控制,我想详细说明为什么您实际上应该这样做。
首先,您需要应用到生产系统的迁移的记录。如果将更改部署到生产环境,并希望迁移数据库,则需要对当前状态进行描述。您可以为应用于每个生产数据库的迁移创建单独的备份,但这似乎不必要地麻烦。
第二,迁移通常包含自定义的手写代码。使用./manage.py makemigrations并不总是能够自动生成它们。
第三,迁移应该包括在代码评审中。它们是对您的生产系统的重大更改,并且有许多事情可能会出错。
因此,简而言之,如果您关心您的生产数据,请检查您到版本控制的迁移。
通常使用的解决方案是,在将任何内容合并到master之前,开发人员必须提取任何远程更改。如果在迁移版本中存在冲突,他应该将本地迁移(远程迁移已经由其他开发人员运行,并且可能已经在生产中运行)重命名为N+1。
在开发过程中,不提交迁移是可以的(但是不要添加忽略,不要添加它们)。但是一旦进入生产环境,您将需要它们来保持模式与模型更改同步。
然后需要编辑该文件,并将依赖项更改为最新的远程版本。
这适用于Django迁移,以及其他类似的应用程序(sqlalchemy+alembic, RoR等)。