在 Django 分叉上维护南迁移
Maintaining South migrations on Django forks
我正在处理一个非常复杂的 Django 项目(50 多个模型),其中包含一些复杂的逻辑(许多不同的工作流、视图、信号、API、后台任务等)。我们称之为 project-base
。目前正在使用 Django 1.6 + South migrations 和相当多的其他第 3 方应用程序。
现在,其中一个要求是创建该项目的一个分支,它会在这里和那里添加一些 fields/models 以及一些额外的逻辑。我们称之为 project-fork
。大部分额外工作将在现有模型之上进行,但也会有一些新模型。
随着 project-base
的不断发展,我们希望这些功能也能进入 project-fork
(就像 git 中的 rebase/merge)。 project-fork
中的额外更改将不会合并回 project-base
。
完成此任务的最佳方法是什么?以下是我的一些想法:
在 project-fork
中使用 South 合并使其与 project-base
中的最新更改保持同步,如 here 所述。使用信号和任何其他必要的方法来保持 project-fork
的新逻辑尽可能松散耦合,以避免任何潜在的冲突。
不要修改任何原始 project-base
模型,而是在引用旧模型的不同应用程序中创建新模型(即使用 OneToOneField
)。额外的逻辑可能会出现在旧的 and/or 新应用程序中。
请说出你的想法:)
我会选择选项 1,因为它总体上看起来不那么复杂,但可能会暴露更大的风险。以下是我对它的看法:
迁移 project-base
:
- 0001_project_base_one
- 0002_project_base_two
- 0003_project_base_three
迁移 project-fork
:
- 0001_project_base_one
- 0002_project_fork_one
合并后,迁移将如下所示:
- 0001_project_base_one
- 0002_project_base_two
- 0002_project_fork_one
- 0003_project_base_three
- 0004_project_fork_merge_noop (已添加以合并来自两个项目的更改)
使用这种方法有什么陷阱吗?有没有更好的方法?
感谢您的宝贵时间。
南方官方工作流程:
南方官方推荐使用--merge
标志试试:http://south.readthedocs.org/en/latest/tutorial/part5.html#team-workflow
这显然不会在所有情况下都有效,但根据我的经验,它在大多数情况下都有效。
陷阱:
- 对同一模型进行多次更改仍然会损坏
- 重复更改可能会破坏内容
"better"方式通常是为了避免同时更改相同的模型,最简单的方法是尽可能减少错误-window。
我在这些情况下的个人工作流程:
使用小分叉,模型变化从一开始就很明显:
- 讨论叉子需要进行哪些模型更改
- 尽快将这些更改应用到 both/all 分支以避免冲突
- 在叉子上工作....
- 合并没有新迁移的分支
使用大分叉,变化并不总是很明显and/or会再次变化:
- 做正常的分叉和开发工作,同时尽可能与最新的 master/develop 分支保持同步
- 在合并回来之前,丢弃所有schemafork
中的迁移
- 合并来自 master/develop
的所有更改
- 重新创建所有需要的架构更改
- 合并到develop/master
我正在处理一个非常复杂的 Django 项目(50 多个模型),其中包含一些复杂的逻辑(许多不同的工作流、视图、信号、API、后台任务等)。我们称之为 project-base
。目前正在使用 Django 1.6 + South migrations 和相当多的其他第 3 方应用程序。
现在,其中一个要求是创建该项目的一个分支,它会在这里和那里添加一些 fields/models 以及一些额外的逻辑。我们称之为 project-fork
。大部分额外工作将在现有模型之上进行,但也会有一些新模型。
随着 project-base
的不断发展,我们希望这些功能也能进入 project-fork
(就像 git 中的 rebase/merge)。 project-fork
中的额外更改将不会合并回 project-base
。
完成此任务的最佳方法是什么?以下是我的一些想法:
在
project-fork
中使用 South 合并使其与project-base
中的最新更改保持同步,如 here 所述。使用信号和任何其他必要的方法来保持project-fork
的新逻辑尽可能松散耦合,以避免任何潜在的冲突。不要修改任何原始
project-base
模型,而是在引用旧模型的不同应用程序中创建新模型(即使用OneToOneField
)。额外的逻辑可能会出现在旧的 and/or 新应用程序中。请说出你的想法:)
我会选择选项 1,因为它总体上看起来不那么复杂,但可能会暴露更大的风险。以下是我对它的看法:
迁移 project-base
:
- 0001_project_base_one
- 0002_project_base_two
- 0003_project_base_three
迁移 project-fork
:
- 0001_project_base_one
- 0002_project_fork_one
合并后,迁移将如下所示:
- 0001_project_base_one
- 0002_project_base_two
- 0002_project_fork_one
- 0003_project_base_three
- 0004_project_fork_merge_noop (已添加以合并来自两个项目的更改)
使用这种方法有什么陷阱吗?有没有更好的方法?
感谢您的宝贵时间。
南方官方工作流程:
南方官方推荐使用--merge
标志试试:http://south.readthedocs.org/en/latest/tutorial/part5.html#team-workflow
这显然不会在所有情况下都有效,但根据我的经验,它在大多数情况下都有效。
陷阱:
- 对同一模型进行多次更改仍然会损坏
- 重复更改可能会破坏内容
"better"方式通常是为了避免同时更改相同的模型,最简单的方法是尽可能减少错误-window。
我在这些情况下的个人工作流程:
使用小分叉,模型变化从一开始就很明显:
- 讨论叉子需要进行哪些模型更改
- 尽快将这些更改应用到 both/all 分支以避免冲突
- 在叉子上工作....
- 合并没有新迁移的分支
使用大分叉,变化并不总是很明显and/or会再次变化:
- 做正常的分叉和开发工作,同时尽可能与最新的 master/develop 分支保持同步
- 在合并回来之前,丢弃所有schemafork 中的迁移
- 合并来自 master/develop 的所有更改
- 重新创建所有需要的架构更改
- 合并到develop/master