如何保持多台机器与 South 和 Git 同步
虽然我很喜欢使用South这个工具,但在这个特定的工作流程中,我遇到了很多问题:
- 在机器A上进行几次迁移
- 定期把更改推送到Git
- 过了一段时间后,回到机器B
- 从Git拉取代码,结果在机器B上迁移时出现各种错误
这些错误通常是“表已经存在”的错误。
我看过很多博客和StackOverflow上的问题,老实说,似乎没有一个明确的答案来告诉我如何正确地处理迁移文件(以及是否应该处理)以及如何将South和Git真正结合起来。
我想要的是一个详细的步骤,教我如何正确地将Git和South一起使用,并展示在两台机器之间的工作流程是怎样的。
目前,我不得不在一段时间后完全清空迁移文件夹,然后从头开始。这看起来并不是一个好的处理方式。
2 个回答
问题
在使用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分支的团队工作规则:
- 在修改模型之前,先确认一下是否有人已经在修改了
- 尽快通知其他成员你所做的修改
- 尽快同步你的迁移目录
根据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/
我想知道关于提交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多个迁移文件,并没有遇到你所描述的那种问题。