在 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

完成此任务的最佳方法是什么?以下是我的一些想法:

  1. project-fork 中使用 South 合并使其与 project-base 中的最新更改保持同步,如 here 所述。使用信号和任何其他必要的方法来保持 project-fork 的新逻辑尽可能松散耦合,以避免任何潜在的冲突。

  2. 不要修改任何原始 project-base 模型,而是在引用旧模型的不同应用程序中创建新模型(即使用 OneToOneField)。额外的逻辑可能会出现在旧的 and/or 新应用程序中。

  3. 请说出你的想法:)

我会选择选项 1,因为它总体上看起来不那么复杂,但可能会暴露更大的风险。以下是我对它的看法:

迁移 project-base

迁移 project-fork

合并后,迁移将如下所示:

使用这种方法有什么陷阱吗?有没有更好的方法?

感谢您的宝贵时间。

南方官方工作流程:

南方官方推荐使用--merge标志试试:http://south.readthedocs.org/en/latest/tutorial/part5.html#team-workflow

这显然不会在所有情况下都有效,但根据我的经验,它在大多数情况下都有效。

陷阱:

  • 对同一模型进行多次更改仍然会损坏
  • 重复更改可能会破坏内容

"better"方式通常是为了避免同时更改相同的模型,最简单的方法是尽可能减少错误-window。

我在这些情况下的个人工作流程:

使用小分叉,模型变化从一开始就很明显:

  1. 讨论叉子需要进行哪些模型更改
  2. 尽快将这些更改应用到 both/all 分支以避免冲突
  3. 在叉子上工作....
  4. 合并没有新迁移的分支

使用大分叉,变化并不总是很明显and/or会再次变化:

  1. 做正常的分叉和开发工作,同时尽可能与最新的 master/develop 分支保持同步
  2. 在合并回来之前,丢弃所有schemafork
  3. 中的迁移
  4. 合并来自 master/develop
  5. 的所有更改
  6. 重新创建所有需要的架构更改
  7. 合并到develop/master