我目前正在使用 Mercurial 和使用 South 的 Django 在不同的本地测试仓库中测试一些复杂的迁移。
我想知道的是;
- Mercurial将如何处理合并
- South 将如何响应合并和/或后续文件
两种情况的结论;坏..
问题 1
Mercurial 几乎从不理解合并模型本身。即使是相当简单的添加/删除字段也会导致Mercurial Resolve
(自动)解析方法失败。
问题 2
迁移文件可能会不同步或无法很好地解决。解决这个问题并不是世界上最糟糕的事情,但它会给 Mercurial 中更大的团队成员带来很大的风险,主要原因是新员工可能会不断地破坏东西。
问题 3
假设我在同一模型中有 4 个同时结帐。现在问题出现了,文件Appname/migrations/
夹中的多个迁移文件具有不同的迁移编号,或者具有相同的不同合并。
这种复杂性引入了Inconsistent Migration History
问题,显示如下;
InconsistentMigrationHistory: Inconsistent migration history
The following options are available:
--merge: will just attempt the migration ignoring any potential dependency conflicts.
.. 紧随其后的是一个--merge
几乎从不工作的东西(类似;的东西DatabaseError: (1091, "Can't DROP 'item_id'; check that column/key exists")
),并且再次冒险依赖许多工作团队成员的修复方法。
我想知道migrations
用类似的东西从存储库中排除文件夹是否明智;
syntax: regexp
^\w+/migrations/.*
我目前正在考虑是否可能迫使团队成员至少首先向首席开发人员报告模型字段的更改。
除此之外,我认为当我们说模型将像这样合并时:
原始回购代码
class Sea(models.Model):
world = models.ForeignKey('World')
name = models.CharField(max_length = 45)
is_it_awesome = models.BooleanField(blank = True, verbose_name = 'Is it awesome?!')
description = models.TextField(blank = True)
团队成员 1 的代码(已提交)
class Sea(models.Model):
world = models.ForeignKey('World')
name = models.CharField(max_length = 45)
description = models.TextField(blank = True)
团队成员 2 的代码
class Sea(models.Model):
world = models.ForeignKey('World')
name = models.CharField(max_length = 45)
is_it_awesome = models.BooleanField(blank = True, verbose_name = 'Is it awesome?!')
belongs_to_country = models.ForeignKey('Country', blank = True, default = None)
description = models.TextField(blank = True)
所以Team member 1
删除了该it_is_awesome
字段,但Team member 2
保留了它并添加了belongs_to_country
.
现在Team member 2
将拉入新代码并查看Team member 1
' 代码与他的代码的冲突。他现在需要选择是否保留该is_it_awesome
字段以及是否添加belongs_to_country
。因此,他走到首席开发人员那里并Team Member 1
讨论了冲突。结论; is_it_awesome
确实需要去,belongs_to_country
可以加。
Team Member 2
如果团队成员和/或首席开发人员做出的选择有不同的结果,仍然需要手动调整合并。
我想知道其他人如何处理这些问题,以及我的方法是否可行或仍然会引入问题。
长话短说; 我可以在没有迁移文件夹的情况下安全地迁移吗?我的另一个担忧是它可能也会导致 South 在数据库中保存的历史记录出现问题。这将要求所有团队成员保持一定的从回购中提取、合并/解决的模式,然后才进行新的迁移。