**实现示例** ```ts type Rule = { pattern: string; owners: string[] } type Change = { path: string; author: string } function match(pattern: string, path: string): boolean { const rx = new RegExp('^' + pattern.replace(/[.+^${}()|[\]\\]/g, r => '\\' + r).replace(/\*/g, '.*') + '$') return rx.test(path) } function ownersFor(rules: Rule[], path: string): string[] { const hits = rules.filter(r => match(r.pattern, path)) if (hits.length === 0) return [] const last = hits[hits.length - 1] return last.owners } function requireReview(rules: Rule[], changes: Change[]): { need: { path: string; owners: string[] }[] } { const need: { path: string; owners: string[] }[] = [] for (const c of changes) { const o = ownersFor(rules, c.path) if (o.length > 0 && !o.includes(c.author)) need.push({ path: c.path, owners: o }) } return { need } } ``` **审计与运行治理** - 记录关键路径变更与责任人;未满足审查门禁阻断合并。 - 例外需到期与审批人;产线默认拒绝未审批项。
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
网站二维码

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
/* 跳过导航链接 (无障碍) */ position: absolute; top: -100px; left: 15px; z-index: 99999; padding: 8px 16px; background: #007bff; color: #fff; font-size: 14px; border-radius: 0 0 4px 4px; text-decoration: none; transition: top 0.2s; } top: 0; outline: 3px solid #0056b3; }