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

Mic*_*ith 100 python git django

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

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

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

Sve*_*ach 106

引自Django迁移文档:

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

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

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

  • 我们是一个开发团队,也有完全相同的问题.如果一个成员执行`makemigrations some_app`,不仅会影响该成员控制下的模型,而且其他相关模型也会受到影响.也就是说,其他应用中的迁移文件(00*_*)将会更改.这在推送或推送GitHub期间会导致许多冲突问题.由于目前我们的系统尚未准备好生产,我们只需`.gitignore`迁移文件.当系统投入生产时,我们仍然不知道如何解决它.有人有任何解决方案吗? (19认同)
  • 因此,如果我很好理解您必须从项目中提取迁移.当你改变一些东西时,你必须做一个本地的makemigrations.再次推送它,构建服务器将进行迁移吗?(非常重要的是每个人都有好的版本) (2认同)
  • 我认为您不应该将迁移文件放入存储库中。它将破坏其他人的开发环境以及其他产品和阶段环境中的迁移状态。(有关示例,请参见Sugar Tang的评论)。跟踪模型文件就足够了。 (2认同)
  • @RandyTang、gurel_kaynak、Diansheng:不要忽视迁移!!!移民冲突必须得到解决,而不是被忽视。请改用适当的 git flow。请阅读下面的答案。这个答案也很好,但是可能会发生合并冲突,必须解决。 (2认同)

Rob*_*b L 22

没有.

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

正如我所看到的,架构的最终记录是models.py.如果我合并的改变和别人拉它,都将是正确的,他们在运行时makemigrationsmigrate.没有必要定义"我们的"战略对于迁移的定义.

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

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

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

任何人?

  • 如果您的环境已经投入生产,则需要迁移!在生产中时,每次更改模型时都无法删除所有数据以从头开始重新生成数据库. (10认同)
  • @Sdra为什么需要从头开始重新生成数据库?我只是`makemigrations`和`migrate`.对数据库进行了更改,所有数据仍然存在. (6认同)
  • @DanielDubovski初始数据应该在`fixtures`文件中.https://docs.djangoproject.com/en/1.10/howto/initial-data/ (5认同)
  • 初始数据怎么样?比如网站的默认设置?如果不同的开发人员在应用程序的不同区域工作,我认为没有理由不提交像002_initial_data这样的东西,并在不同的开发人员之间进行更新. (4认同)
  • 我也发现提交迁移文件比造成更多麻烦.@RobL是现货.模型文件是数据库模式的基本事实.当每个人都可以解决模式文件时(为makemigrations和migrate),为什么要引入另一层复杂性 (4认同)
  • @RobL:您正在考虑开发场景场景.但是,如果您在生产环境中运行,则数据库已填满,您不能简单地使用`makemigrations`和`migrate`. (3认同)
  • @RobL`makemigrations`和`migrate`只适用于脑死亡的简单迁移,你可以在这里做一些事情,比如创建一个新的字段/表,或者删除一个旧的字段/表.对于任何更复杂的事情,您通常需要进行一些模式迁移,并在中间进行数据迁移. (3认同)
  • 迁移不是用于"模式的最终记录",而是用于记录历史记录,以便各种部署可以知道它应该如何到达该确定记录,这不是一条直线. (2认同)

tec*_*kuz 11

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

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

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


Sup*_*ova 10

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

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

在我看来,你根本不应该makemigrations投入生产.您可以migrate在生产环境中运行,您将看到从本地提交的迁移文件中应用了迁移.这样您就可以避免所有冲突.

在LOCAL ENV中,创建迁移文件,

python manage.py makemigrations 
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

现在提交这些新创建的文件,如下所示.

git add app/migrations/...
git commit -m 'add migration files' app/migrations/...
Run Code Online (Sandbox Code Playgroud)

在PRODUCTION ENV中,仅运行以下命令.

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,迁移文件应该只在应用程序部署后成为 repo 的一部分。这算作初始迁移。如果应用程序仍在大量开发中,我们可以放心地忽略它。但是一旦上线。就是这样!这是迁移应该被放入 repo 的标志。然后每个其他成员都需要遵循此迁移并在需要时放置他们的 (6认同)
  • 对已提交的迁移只运行 `migrate` 而永远不要运行 `makemigrations` 是一个很好的观点。从来没有想过。 (2认同)

Sdr*_*dra 9

TL;DR:提交迁移,解决迁移冲突,调整您的 git 工作流程。

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

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

如果存在冲突,则无法合并 PR,因此需要合并其功能的人需要解决冲突,包括迁移。这可能需要不同团队之间的协调。

提交迁移文件很重要!如果出现冲突,Django 甚至可以帮助您解决这些冲突;)


Ant*_*ggs 5

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

我遵循的过程非常简单 - 每当您更改应用程序的模型时,您还可以提交迁移,然后该迁移不会更改- 如果您需要模型中的不同内容,那么您可以更改模型并提交一个迁移新的迁移伴随着您的更改。

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


Why*_*ugo 5

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

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

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

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