3

我目前正在使用 Mercurial 和使用 South 的 Django 在不同的本地测试仓库中测试一些复杂的迁移。

我想知道的是;

  1. Mercurial将如何处理合并
  2. 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 在数据库中保存的历史记录出现问题。这将要求所有团队成员保持一定的从回购中提取、合并/解决的模式,然后才进行新的迁移。

4

1 回答 1

1

问题 1

https://www.mercurial-scm.org/wiki/TutorialConflict

您会发现的唯一冲突是当 2 个人触摸相同的代码时,mercurial 要求您进行干预是 100% 正确的。

问题 2

您应该从阅读 South 文档开始:第 5 部分:团队和工作流程

确保当员工将他们的分支合并到开发/集成分支时,如果需要在其他所有操作之后运行,他们将迁移到下一个最高数字,否则您可以正常运行--merge

问题 3

开发者 2 在集成自己的分支之前,应该将当前开发版本合并到自己的分支中,并解决冲突。只有当冲突解决后,他才应将其合并回开发分支。

或者,您有一个“Lead Dev”作为看门人,负责将功能拉入集成分支并对冲突采取行动。

始终将您的迁移存储在存储库中。不要排除迁移。它们是代码,就像您的其他代码一样,您必须在合并时考虑迁移。投入时间和精力来妥善维护它们,您将因此获得 10 倍的回报。

于 2013-07-26T03:25:09.077 回答