3

私は現在、Mercurial を使用したさまざまなローカル テスト リポジトリと South を使用した Django で、いくつかの複雑な移行をテストしています。

私が見つけようとしているのは;

  1. Mercurial は合併にどのように対処しますか
  2. マージされたファイルおよび/またはフォローアップファイルにサウスはどのように対応しますか

両方のケースの結論; 悪い..

問題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..ほとんど機能しないa が続き(; のようなもの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_awesomeTeam member 2belongs_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チーム メンバーや主任開発者が行った選択とは異なる結果が生じた場合は、手動でマージを微調整する必要があります。

他の人がこれらの問題にどのように対処するのか、私のアプローチが問題ないのか、それとも問題を引き起こすのか疑問に思っています.

簡単に言えば、移行フォルダなしで安全に移行できますか? 私のもう1つの懸念は、サウスがデータベースに保持している履歴にも問題が発生する可能性があることです. すべてのチーム メンバーが、レポからのプル、マージ/解決の特定のパターンを維持し、それから新しい移行を行う必要があります。

4

1 に答える 1

1

問題1

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

唯一の競合は、2 人が同じコードに触れた場合であり、mercurial が介入を求めるのは 100% 正しいことです。

問題 2

South のドキュメントを読むことから始めてください:パート 5: チームとワークフロー

従業員がブランチを開発/統合ブランチにマージするとき、他のすべての後に実行する必要がある場合は、移行を次に高い番号に移動するようにしてください。それ以外の場合は、問題なく実行できます--merge

問題 3

開発者 2 は自分のブランチを統合する前に、現在の開発バージョンを自分の開発バージョンにマージし、競合を解決する必要があります。競合が解決された場合にのみ、それを開発ブランチにマージする必要があります。

または、ゲートキーパーとして機能し、機能を統合ブランチに取り込み、競合に対処する責任を負う「リード開発者」がいます。

移行は常にリポジトリに保存してください。移行を除外しないでください。それらはコードの残りの部分と同様にコードであり、マージするときは移行を考慮する必要があります。それらを適切に維持するために時間と労力を費やすと、10倍の報酬が得られます.

于 2013-07-26T03:25:09.077 に答える