我应该在.gitignore文件中添加Django迁移文件吗?
由于迁移冲突,我最近遇到了很多git问题,我想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何去添加所有的迁移,我在我的应用程序,并将它们添加到.gitignore文件?
我应该在.gitignore文件中添加Django迁移文件吗?
由于迁移冲突,我最近遇到了很多git问题,我想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何去添加所有的迁移,我在我的应用程序,并将它们添加到.gitignore文件?
当前回答
Gitignore迁移,如果你有独立的db用于开发,分期和生产环境。出于开发目的,您可以使用本地sqlite DB并在本地进行迁移。 我建议你创建四个额外的分支:
Master - Clean fresh code without migrations. Nobody is connected to this branch. Used for code reviews only Development - daily development. Push/pull accepted. Each developer is working on sqlite DB Cloud_DEV_env - remote cloud/server DEV environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Dev database Cloud_STAG_env - remote cloud/server STAG environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Stag database Cloud_PROD_env - remote cloud/server DEV environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Prod database
注: 2、3、4——迁移可以保存在回购中,但是应该有严格的pull请求合并规则,所以我们决定找一个人来负责部署,所以唯一一个拥有所有迁移文件的人——我们的部署人员。每当我们在模型中有任何变化时,他都会保持远程DB迁移。
其他回答
在git中有一堆迁移文件是很混乱的。迁移文件夹中只有一个文件不应该忽略。该文件是init.py文件,如果忽略它,python将不再在目录中查找子模块,因此任何导入模块的尝试都会失败。所以问题应该是如何忽略除了init.py之外的所有迁移文件? 解决方案是: 将“0*.py”添加到.gitignore文件中,它可以完美地完成工作。
希望这能帮助到一些人。
您可以遵循以下流程。
您可以在本地运行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
简短的回答 我建议在回购中排除迁移。代码合并后,只需运行./manage.py makemigrations,就可以完成所有设置。
长回答 我认为您不应该将迁移文件放入repo。它会破坏在别人的开发环境和其他刺激和阶段环境中的迁移状态。(举例请参考Sugar Tang的评论)。
在我看来,Django迁移的目的是找到以前的模型状态和新的模型状态之间的差距,然后序列化这个差距。如果你的模型在代码合并后发生了变化,你可以简单地做makemigrationations来找出差距。当您可以自动且无错误地完成相同的迁移时,为什么还要手动且仔细地合并其他迁移呢?Django文档说,
他们*(迁移)*被设计成大部分是自动的
; 请保持这样。要手动合并迁移,您必须完全理解其他人更改了什么以及更改的依赖性。这是很大的开销,而且很容易出错。因此跟踪模型文件就足够了。
这是关于工作流的一个很好的主题。我愿意接受其他选择。
Gitignore迁移,如果你有独立的db用于开发,分期和生产环境。出于开发目的,您可以使用本地sqlite DB并在本地进行迁移。 我建议你创建四个额外的分支:
Master - Clean fresh code without migrations. Nobody is connected to this branch. Used for code reviews only Development - daily development. Push/pull accepted. Each developer is working on sqlite DB Cloud_DEV_env - remote cloud/server DEV environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Dev database Cloud_STAG_env - remote cloud/server STAG environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Stag database Cloud_PROD_env - remote cloud/server DEV environment. Pull only. Keep migrations locally on machine, which is used for the code deployment and remote migrations of Prod database
注: 2、3、4——迁移可以保存在回购中,但是应该有严格的pull请求合并规则,所以我们决定找一个人来负责部署,所以唯一一个拥有所有迁移文件的人——我们的部署人员。每当我们在模型中有任何变化时,他都会保持远程DB迁移。
我无法想象为什么会出现冲突,除非您正在以某种方式编辑迁移?这通常会以糟糕的结果结束——如果有人错过了一些中间提交,那么他们将无法从正确的版本升级,并且他们的数据库副本将被损坏。
我遵循的过程非常简单——无论何时你改变了一个应用程序的模型,你也提交了一个迁移,然后这个迁移不会改变——如果你需要模型中有一些不同的东西,那么你就改变模型,并在你的改变的同时提交一个新的迁移。
在未开发的项目中,当你发布时,你通常可以删除迁移,然后用0001_迁移从头开始,但如果你有生产代码,那么你不能(尽管你可以把迁移压缩成一个)。