我应该在.gitignore文件中添加Django迁移文件吗?

我应该在.gitignore文件中添加Django迁移文件吗?

由于迁移冲突,我最近收到了很多git问题,并且想知道我是否应该将迁移文件标记为忽略。

如果是这样,我将如何添加我的应用程序中的所有迁移,并将它们添加到.gitignore文件中?

Michael Smith asked 2019-09-11T01:49:08Z
9个解决方案
93 votes

引自Django迁移文档:

每个应用程序的迁移文件都位于该应用程序内部的“迁移”目录中,旨在提交给代码库并作为其代码库的一部分进行分发。 您应该在开发计算机上进行一次,然后在同事的计算机,临时计算机以及最终的生产计算机上运行相同的迁移。

如果您遵循此过程,则不应在迁移文件中收到任何合并冲突。

要缓解您当前遇到的任何问题,您应指定哪个存储库或分支具有迁移文件的权威版本,然后使用git的属性机制为这些文件指定合并策略“ours”。 这将告诉git始终忽略对这些文件的外部更改,而不喜欢本地版本。

Sven Marnach answered 2019-09-11T01:49:43Z
15 votes

没有。

我已经多次这样做了,在我的生活中,我不能找到一个需要在回购中迁移的案例。

正如我所看到的,架构的最终记录是models.如果我合并了一个更改而其他人拉了它,那么当它们运行makemigrationsmigrate时一切都是正确的。没有必要定义“我们的”策略是什么迁移。

如果我们需要回滚,那么我们还原models并进行迁移。 一切都好,没有问题。

没抱怨某个领域已经存在,等等。

我想知道是否有人能给我一个特定的案例,在我开始工作之前必须合并另一个开发人员的迁移文件是一个优势。 我知道文档说我应该,所以我认为是这样的。 但我从来没有遇到过一个。

任何人?

Rob L answered 2019-09-11T01:50:48Z
7 votes

您可以按照以下流程操作。

您可以在本地运行makemigrations,这将创建迁移文件。 将此新迁移文件提交到repo。

在我看来,你根本不应该在生产中运行makemigrations。 您可以在生产中运行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
SuperNova answered 2019-09-11T01:51:46Z
4 votes

引用2018年的文档,Django 2.0。 (两个单独的命令= makemigrationsmigrate

有单独的命令来制作和应用的原因   迁移是因为您将提交迁移到版本控制   系统并与您的应用程序一起发货; 他们不仅让你的   开发更容易,它们也可供其他开发人员使用   生产。

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

trthhrtz answered 2019-09-11T01:52:26Z
2 votes

我无法想象为什么你会遇到冲突,除非你以某种方式编辑迁移? 这通常会很糟糕 - 如果有人错过了某些中间提交,那么他们将无法从正确的版本升级,并且他们的数据库副本将被破坏。

我遵循的过程非常简单 - 无论何时更改应用程序的模型,您还提交迁移,然后迁移不会更改 - 如果您需要在模型中有不同的东西,那么您更改模型并提交 新的迁移与您的更改一起。

在绿地项目中,您通常可以删除迁移,并在发布时通过0001_迁移从头开始,但如果您有生产代码,则不能(尽管您可以将迁移压缩为一个)。

Anthony Briggs answered 2019-09-11T01:53:06Z
2 votes

通常使用的解决方案是,在将任何内容合并到master之前,开发人员必须进行任何远程更改。 如果迁移版本存在冲突,他应该将其本地迁移(远程的迁移由其他开发人员运行,并且可能在生产中)重命名为N + 1。

在开发期间,可能没有提交迁移(不要添加忽略,只是不要dependencies)。 但是,一旦您投入生产,您将需要它们以使架构与模型更改保持同步。

然后,您需要编辑该文件,并将dependencies更改为最新的远程版本。

这适用于Django迁移,以及其他类似的应用程序(sqlalchemy + alembic,RoR等)。

WhyNotHugo answered 2019-09-11T01:53:53Z
0 votes

感觉就像你需要调整你的git工作流程,而不是忽略冲突。

理想情况下,每个新功能都在不同的分支中开发,并与pull请求合并。

如果存在冲突,则无法合并PR,因此需要合并其功能需求来解决冲突,包括迁移。

Sdra answered 2019-09-11T01:54:32Z
0 votes

简短的回答我建议在回购中排除迁移。 代码合并后,只需运行makemigrations就可以了。

答案很长我认为您不应该将迁移文件放入repo。 它将破坏其他人的开发环境和其他产品和舞台环境中的迁移状态。 (参考Sugar Tang的评论中的例子)。

在我看来,Django迁移的目的是找到先前模型状态和新模型状态之间的差距,然后将差距序列化。 如果您的模型在代码合并后发生变化,您可以简单地执行makemigrations以找出差距。 当您可以自动实现相同的迁移并且没有bug时,为什么还要手动并仔细地合并其他迁移? Django文档说,

他们*(迁移)*的设计主要是自动的

; 请保持这种方式。 要手动合并迁移,您必须完全了解其他人已更改的内容以及对更改的依赖性。 这是很多开销和容易出错的。 因此跟踪模型文件就足够了。

这是一个关于工作流程的好主题。 我对其他选择持开放态度。

Diansheng answered 2019-09-11T01:55:34Z
0 votes

在git中拥有一堆迁移文件很麻烦。 迁移文件夹中只有一个文件您不应忽略。 该文件是init.py文件,如果忽略它,python将不再查找目录中的子模块,因此导入模块的任何尝试都将失败。 所以问题应该是如何忽略所有迁移文件但init.py?解决方案是:将'0 * .py'添加到.gitignore文件中,它可以完美地完成工作。

希望这有助于某人。

Gizachew Soboksa answered 2019-09-11T01:56:08Z
translate from https://stackoverflow.com:/questions/28035119/should-i-be-adding-the-django-migration-files-in-the-gitignore-file