如何保持多台机器与 South 和 Git 同步

4 投票
2 回答
702 浏览
提问于 2025-04-17 08:47

虽然我很喜欢使用South这个工具,但在这个特定的工作流程中,我遇到了很多问题:

  • 在机器A上进行几次迁移
  • 定期把更改推送到Git
  • 过了一段时间后,回到机器B
  • 从Git拉取代码,结果在机器B上迁移时出现各种错误

这些错误通常是“表已经存在”的错误。

我看过很多博客和StackOverflow上的问题,老实说,似乎没有一个明确的答案来告诉我如何正确地处理迁移文件(以及是否应该处理)以及如何将South和Git真正结合起来。

我想要的是一个详细的步骤,教我如何正确地将Git和South一起使用,并展示在两台机器之间的工作流程是怎样的。

目前,我不得不在一段时间后完全清空迁移文件夹,然后从头开始。这看起来并不是一个好的处理方式。

2 个回答

1

问题

在使用south和团队协作时,问题出现的情况是当两个人在没有同步的情况下各自创建迁移文件。

想象一下,我们有一个代码库。A和B两个人都克隆了这个库,然后各自修改了一些模型,创建了迁移文件,最后把这些都推送回去。结果就是在代码库里会有两个相同编号的迁移文件。

如果你尝试使用这样的历史记录来创建迁移,south会报错。

Inconsistent migration history
The following options are available:
   --merge: will just attempt the migration ignoring any potential dependency conflicts.

根据south的文档,http://south.readthedocs.org/en/latest/tutorial/part5.html,你可以尝试使用--merge选项,south会尝试合并迁移文件。如果有冲突的迁移文件修改了同一个模型,那就会失败。

./manage.py schemamigration --auto --merge appname 

所以团队的主要规则是:在同一时间内,只有一个开发者可以修改一个模型。如果有人开始修改模型,那么在他们的迁移文件更新之前,其他人都不应该去碰这个模型。

使用south和多个git分支的团队工作规则:

  1. 在修改模型之前,先确认一下是否有人已经在修改了
  2. 尽快通知其他成员你所做的修改
  3. 尽快同步你的迁移目录

根据south的文档:当你拉取其他人对模型的修改时,连同他们自己的迁移文件,你需要创建一个新的空迁移文件,把两个开发分支的更改都包含进去(如果你使用的是mercurial,这相当于一个合并提交)。要做到这一点,只需运行:

 ./manage.py schemamigration --empty appname merge_models

merge_models 这里是新的迁移文件名

使用south和单个git分支的团队工作规则:

如果你们团队的所有成员都在一个分支上提交代码,那么最佳策略是先进行模型的修改,创建迁移文件,并尽快推送。然后再处理其他代码。

这篇文章也许对你有帮助:

http://andrewingram.net/2012/dec/common-pitfalls-django-south/ http://anthony-tresontani.github.io/Django/2013/03/15/south-workflow/

1

我想知道关于提交South迁移文件的疑问是从哪里来的。我确实没有听说过有什么建议说你不应该这么做。

在你的工作流程中,你没有说明机器A和B是使用同一个数据库还是不同的数据库。如果你在这两台机器上的代码差别很大,那么它们应该使用不同的数据库。如果数据库的结构(schema)比代码更新得快,你就会遇到错误。显然,数据库的结构不能落后于代码,因为你应该在每次代码更新后都运行migrate

我的工作流程是这样的:

A: create schema migrations and apply as they are created.
A: add schema migration files to subversion and commit
B: svn up
B: python manage.py migrate
B: continue coding!

因为迁移文件可能包含用于转换数据库中数据的代码,所以你不应该删除这些迁移文件,因为那样你会失去这些代码。我有一个三人的开发团队,他们创建了80多个迁移文件,并没有遇到你所描述的那种问题。

撰写回答