2013A、2013B、および 2013C など、共同で対応するブランチとともに、年に 3 つのメジャー リリースがあります。各ブランチを作成すると、デフォルトから開始されます。各ブランチの変更は、前方にのみマージする必要があります(例: 2013A -> 2013B -> 2013C -> デフォルト)。 サーバーには、プッシュされたマージが間違った方向 (デフォルト -> 2013C、2013C -> 2013B など) にあるかどうかをチェックするプッシュ フックがあります。
また、チーム固有のブランチもあり、リリースの機能に取り組んでいるブランチもあれば、デフォルトなどの次のリリースに取り組んでいるブランチもあります。チームがリリースに取り組んでいる間、リリース ブランチとの間でマージします。チームが次のリリースに取り掛かる準備ができたら、デフォルト ブランチとのマージを開始します。
先日、チームが次のリリースに移行する準備が整う前に、新しい開発者が default を自分のチーム ブランチにマージし、チーム ブランチを以前のリリース、つまり default -> TeamBranch -> 2013B にマージしたという状況がありました。残念ながら、私たちのフックはこの状況を考慮していませんでした。
本質的に、これが起こったことです:
2013B A---o---o---o---o---B---o
/ \ / \
Team / o---o---o---C---o---o
/ / \
Default D---o---o---o---o---o---o---o---o
A = 2013B ブランチの作成
B = リリース ブランチへ
のマージ C = 不適切なマージ。リリース ブランチにマージするたびに、これらを検出して防止したいと考えています。
D = リリース ブランチとデフォルトの最初の共通祖先。
そこで、フックを書き直して、変更がリリース ブランチにマージされたときに逆方向にマージされないことを確認しました。リリース ブランチへのマージごとに、フォワード ブランチからの先祖マージがないことを確認します。私が使用している revset クエリは次のとおりです。
> hg log -r "limit(descendants(p1(first(branch('2013B')))) and reverse(p2(ancestors(branch('2013B'))) and branch('default')),1)"
これは機能します。ただし、大規模なリポジトリ (111,000 以上の変更セット) があり、チェックには 30 ~ 40 秒かかります。revsetクエリを作成するためのより高速/高速/効率的な方法、または私が見ていない別のアプローチがあるかどうかを知りたかったのです。