我应该在 .gitignore 文件中添加 Django 迁移文件吗?
Should I be adding the Django migration files in the .gitignore file?
我应该在 .gitignore
文件中添加 Django 迁移文件吗?
由于迁移冲突,我最近遇到了很多 git 问题,想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何添加我的应用程序中的所有迁移,并将它们添加到 .gitignore
文件中?
引自Django migrations documentation:
The migration files for each app live in a “migrations” directory inside of that app, and are designed to be committed to, and distributed as part of, its codebase. You should be making them once on your development machine and then running the same migrations on your colleagues’ machines, your staging machines, and eventually your production machines.
如果您遵循此过程,您应该不会在迁移文件中遇到任何合并冲突。
合并版本控制分支时,您仍然可能会遇到基于同一父迁移的多个迁移的情况,例如如果不同的开发人员同时引入了迁移。解决这种情况的一种方法是引入 merge_migration。通常这可以使用命令自动完成
./manage.py makemigrations --merge
这将引入一个依赖于所有当前头部迁移的新迁移。当然这只适用于头部迁移之间没有冲突的情况,在这种情况下你将不得不手动解决问题。
鉴于这里有些人建议您不应该 将迁移提交到版本控制,我想详细说明您实际上 的原因应该这样做。
首先,您需要记录应用于生产系统的迁移。如果将更改部署到生产环境并希望迁移数据库,则需要对当前状态的描述。您可以为应用于每个生产数据库的迁移创建单独的备份,但这似乎不必要地麻烦。
其次,迁移通常包含自定义的手写代码。使用 ./manage.py makemigrations
.
并不总是可以自动生成它们
第三,迁移应该包含在代码审查中。它们是对您的生产系统的重大更改,并且有很多地方可能会出错。
简而言之,如果您关心您的生产数据,请检查您对版本控制的迁移。
TL;DR:提交迁移,解决迁移冲突,调整您的 git 工作流程。
感觉您需要调整 git 工作流程,而不是忽略冲突。
理想情况下,每个新功能都在不同的分支中开发,并通过 拉取请求 合并回来。
PR有冲突就不能合并,所以谁要合并他的feature需要解决冲突,包括migrations。这可能需要不同团队之间的协调。
提交迁移文件很重要!如果出现冲突,Django might even help you solve those conflicts ;)
我无法想象为什么你会遇到冲突,除非你以某种方式编辑迁移?这通常会以糟糕的方式结束 - 如果有人错过了一些中间提交,那么他们将不会从正确的版本升级,并且他们的数据库副本将被破坏。
我遵循的过程非常简单 - 每当您更改应用程序的模型时,您也会提交迁移,然后 迁移不会改变 - 如果您在模型中需要一些不同的东西,然后更改模型并在更改的同时提交新的迁移。
在新建项目中,您通常可以删除迁移并在发布时使用 0001_ 迁移从头开始,但如果您有生产代码,则不能(尽管您可以将迁移压缩为一个) .
您可以按照以下流程进行。
您可以 运行 makemigrations
在本地创建迁移文件。将这个新的迁移文件提交到 repo。
在我看来,你根本不应该 运行 makemigrations
在生产中。您可以 运行 migrate
在生产中,您会看到迁移是从您从本地提交的迁移文件应用的。这样你就可以避免所有的冲突。
IN LOCAL ENV,创建迁移文件,
python manage.py makemigrations
python manage.py migrate
现在提交这些新创建的文件,如下所示。
git add app/migrations/...
git commit -m 'add migration files' app/migrations/...
在生产环境中,运行只有下面的命令。
python manage.py migrate
通常使用的解决方案是,在将任何内容合并到 master 之前,开发人员必须拉取任何远程更改。如果迁移版本存在冲突,他应该将他的 local 迁移重命名为 N+ 1.
在开发过程中,不提交迁移可能没问题(不过不要添加忽略,只是不要 add
它们)。但是一旦投入生产,您将需要它们以使模式与模型更改保持同步。
然后您需要编辑文件,并将 dependencies
更改为最新的远程版本。
这适用于 Django 迁移,以及其他类似的应用程序(sqlalchemy+alembic、RoR 等)。
简答
我建议在 repo 中排除迁移。代码合并后,只需 运行 ./manage.py makemigrations
就可以了。
长答案
我认为您不应该将迁移文件放入回购协议中。它会破坏其他人的开发环境和其他产品和舞台环境中的迁移状态。 (有关示例,请参阅 Sugar Tang 的评论)。
在我看来,Django 迁移的目的是找到先前模型状态和新模型状态之间的差距,然后序列化差距。如果您的模型在代码合并后发生变化,您可以简单地执行 makemigrations
来找出差距。当您可以自动实现相同且无错误时,为什么要手动并小心地合并其他迁移? Django documentation 说,
They*(migrations)*’re designed to be mostly automatic
;请保持这种状态。要手动合并迁移,您必须充分了解其他人更改的内容以及更改的任何依赖性。这是很多开销并且容易出错。所以跟踪模型文件就足够了。
这是一个关于工作流程的好话题。我对其他选择持开放态度。
引自 2022 文档,Django 4.0。 (两个单独的命令 = makemigrations
和 migrate
)
The reason that there are separate commands to make and apply
migrations is because you’ll commit migrations to your version control
system and ship them with your app; they not only make your
development easier, they’re also useable by other developers and in
production.
git 中有一堆迁移文件很乱。迁移文件夹中只有一个文件不可忽略。该文件是 init.py 文件,如果忽略它,python 将不再在目录中查找子模块,因此任何导入模块的尝试都会失败。所以问题应该是如何忽略除init.py之外的所有迁移文件?
解决办法是:
将 '0*.py' 添加到 .gitignore 文件,它可以完美地完成工作。
希望这对某人有所帮助。
Gitignore 迁移,如果您有单独的数据库用于开发、登台和生产环境。对于开发者。目的您可以使用本地 sqlite 数据库并在本地进行迁移。
我建议您创建四个额外的分支:
Master - 无需迁移即可清理新代码。没有人连接到这个分支。仅用于代码审查
开发-日常开发。 Push/pull 接受。每个开发人员都在使用 sqlite DB
Cloud_DEV_env - 远程 cloud/server DEV 环境。只拉。 keep migrations locally on machine,用于Dev数据库的代码部署和远程迁移
Cloud_STAG_env - 远程 cloud/server STAG 环境。只拉。将迁移保存在机器本地,用于 Stag 数据库的代码部署和远程迁移
Cloud_PROD_env - 远程 cloud/server DEV 环境。只拉。将migrations保存在机器本地,用于Prod数据库的代码部署和远程迁移
备注:
2、3、4 - 迁移可以保存在 repos 中,但应该有严格的拉取请求合并规则,所以我们决定找一个人负责部署,所以唯一拥有所有迁移文件的人 - 我们的 deploy-er.每次我们对模型进行任何更改时,他都会进行远程数据库迁移。
您应该将迁移视为数据库架构的版本控制系统。 makemigrations 负责将您的模型更改打包到单独的迁移文件中 - 类似于提交 - 而 migrate 负责将这些更改应用到您的数据库中。
每个应用程序的迁移文件都位于该应用程序内的“迁移”目录中,并且设计为提交并作为其代码库的一部分分发。您应该在您的开发机器上进行一次,然后 运行 在您同事的机器、您的暂存机器和最终您的生产机器上进行相同的迁移。
黄金法则:开发一次制作,全部迁移
我应该在 .gitignore
文件中添加 Django 迁移文件吗?
由于迁移冲突,我最近遇到了很多 git 问题,想知道是否应该将迁移文件标记为忽略。
如果是这样,我将如何添加我的应用程序中的所有迁移,并将它们添加到 .gitignore
文件中?
引自Django migrations documentation:
The migration files for each app live in a “migrations” directory inside of that app, and are designed to be committed to, and distributed as part of, its codebase. You should be making them once on your development machine and then running the same migrations on your colleagues’ machines, your staging machines, and eventually your production machines.
如果您遵循此过程,您应该不会在迁移文件中遇到任何合并冲突。
合并版本控制分支时,您仍然可能会遇到基于同一父迁移的多个迁移的情况,例如如果不同的开发人员同时引入了迁移。解决这种情况的一种方法是引入 merge_migration。通常这可以使用命令自动完成
./manage.py makemigrations --merge
这将引入一个依赖于所有当前头部迁移的新迁移。当然这只适用于头部迁移之间没有冲突的情况,在这种情况下你将不得不手动解决问题。
鉴于这里有些人建议您不应该 将迁移提交到版本控制,我想详细说明您实际上 的原因应该这样做。
首先,您需要记录应用于生产系统的迁移。如果将更改部署到生产环境并希望迁移数据库,则需要对当前状态的描述。您可以为应用于每个生产数据库的迁移创建单独的备份,但这似乎不必要地麻烦。
其次,迁移通常包含自定义的手写代码。使用 ./manage.py makemigrations
.
第三,迁移应该包含在代码审查中。它们是对您的生产系统的重大更改,并且有很多地方可能会出错。
简而言之,如果您关心您的生产数据,请检查您对版本控制的迁移。
TL;DR:提交迁移,解决迁移冲突,调整您的 git 工作流程。
感觉您需要调整 git 工作流程,而不是忽略冲突。
理想情况下,每个新功能都在不同的分支中开发,并通过 拉取请求 合并回来。
PR有冲突就不能合并,所以谁要合并他的feature需要解决冲突,包括migrations。这可能需要不同团队之间的协调。
提交迁移文件很重要!如果出现冲突,Django might even help you solve those conflicts ;)
我无法想象为什么你会遇到冲突,除非你以某种方式编辑迁移?这通常会以糟糕的方式结束 - 如果有人错过了一些中间提交,那么他们将不会从正确的版本升级,并且他们的数据库副本将被破坏。
我遵循的过程非常简单 - 每当您更改应用程序的模型时,您也会提交迁移,然后 迁移不会改变 - 如果您在模型中需要一些不同的东西,然后更改模型并在更改的同时提交新的迁移。
在新建项目中,您通常可以删除迁移并在发布时使用 0001_ 迁移从头开始,但如果您有生产代码,则不能(尽管您可以将迁移压缩为一个) .
您可以按照以下流程进行。
您可以 运行 makemigrations
在本地创建迁移文件。将这个新的迁移文件提交到 repo。
在我看来,你根本不应该 运行 makemigrations
在生产中。您可以 运行 migrate
在生产中,您会看到迁移是从您从本地提交的迁移文件应用的。这样你就可以避免所有的冲突。
IN LOCAL ENV,创建迁移文件,
python manage.py makemigrations
python manage.py migrate
现在提交这些新创建的文件,如下所示。
git add app/migrations/...
git commit -m 'add migration files' app/migrations/...
在生产环境中,运行只有下面的命令。
python manage.py migrate
通常使用的解决方案是,在将任何内容合并到 master 之前,开发人员必须拉取任何远程更改。如果迁移版本存在冲突,他应该将他的 local 迁移重命名为 N+ 1.
在开发过程中,不提交迁移可能没问题(不过不要添加忽略,只是不要 add
它们)。但是一旦投入生产,您将需要它们以使模式与模型更改保持同步。
然后您需要编辑文件,并将 dependencies
更改为最新的远程版本。
这适用于 Django 迁移,以及其他类似的应用程序(sqlalchemy+alembic、RoR 等)。
简答
我建议在 repo 中排除迁移。代码合并后,只需 运行 ./manage.py makemigrations
就可以了。
长答案 我认为您不应该将迁移文件放入回购协议中。它会破坏其他人的开发环境和其他产品和舞台环境中的迁移状态。 (有关示例,请参阅 Sugar Tang 的评论)。
在我看来,Django 迁移的目的是找到先前模型状态和新模型状态之间的差距,然后序列化差距。如果您的模型在代码合并后发生变化,您可以简单地执行 makemigrations
来找出差距。当您可以自动实现相同且无错误时,为什么要手动并小心地合并其他迁移? Django documentation 说,
They*(migrations)*’re designed to be mostly automatic
;请保持这种状态。要手动合并迁移,您必须充分了解其他人更改的内容以及更改的任何依赖性。这是很多开销并且容易出错。所以跟踪模型文件就足够了。
这是一个关于工作流程的好话题。我对其他选择持开放态度。
引自 2022 文档,Django 4.0。 (两个单独的命令 = makemigrations
和 migrate
)
The reason that there are separate commands to make and apply migrations is because you’ll commit migrations to your version control system and ship them with your app; they not only make your development easier, they’re also useable by other developers and in production.
git 中有一堆迁移文件很乱。迁移文件夹中只有一个文件不可忽略。该文件是 init.py 文件,如果忽略它,python 将不再在目录中查找子模块,因此任何导入模块的尝试都会失败。所以问题应该是如何忽略除init.py之外的所有迁移文件? 解决办法是: 将 '0*.py' 添加到 .gitignore 文件,它可以完美地完成工作。
希望这对某人有所帮助。
Gitignore 迁移,如果您有单独的数据库用于开发、登台和生产环境。对于开发者。目的您可以使用本地 sqlite 数据库并在本地进行迁移。 我建议您创建四个额外的分支:
Master - 无需迁移即可清理新代码。没有人连接到这个分支。仅用于代码审查
开发-日常开发。 Push/pull 接受。每个开发人员都在使用 sqlite DB
Cloud_DEV_env - 远程 cloud/server DEV 环境。只拉。 keep migrations locally on machine,用于Dev数据库的代码部署和远程迁移
Cloud_STAG_env - 远程 cloud/server STAG 环境。只拉。将迁移保存在机器本地,用于 Stag 数据库的代码部署和远程迁移
Cloud_PROD_env - 远程 cloud/server DEV 环境。只拉。将migrations保存在机器本地,用于Prod数据库的代码部署和远程迁移
备注: 2、3、4 - 迁移可以保存在 repos 中,但应该有严格的拉取请求合并规则,所以我们决定找一个人负责部署,所以唯一拥有所有迁移文件的人 - 我们的 deploy-er.每次我们对模型进行任何更改时,他都会进行远程数据库迁移。
您应该将迁移视为数据库架构的版本控制系统。 makemigrations 负责将您的模型更改打包到单独的迁移文件中 - 类似于提交 - 而 migrate 负责将这些更改应用到您的数据库中。
每个应用程序的迁移文件都位于该应用程序内的“迁移”目录中,并且设计为提交并作为其代码库的一部分分发。您应该在您的开发机器上进行一次,然后 运行 在您同事的机器、您的暂存机器和最终您的生产机器上进行相同的迁移。
黄金法则:开发一次制作,全部迁移