Skip to content

[Governance] 为 Git 授权 wrapper 建立破坏性命令语料库 #130

Description

@liuli195

详细背景

PR #128 实现 #125 的主干授权 wrapper 时,Standards review 连续发现多轮主干保护绕过:

  • 第一轮:git push origin +HEAD:maingit push --mirror origingit push --prune origin 等 destructive push 形态未全部拦截。
  • 第二轮:git -C . push --mirror origingit -C . push origin +HEAD:main 这类 Git global option 形态绕过了对子命令位置的假设。
  • 第三轮:git push -uf origin maingit push --mir origingit push --del origin main 等 Git 允许的短选项簇和长选项缩写又暴露了新绕过面。

这些具体问题已在 PR #128 中修复并合并;本 issue 不重复修这些 case。未解决的是系统性问题:主干授权 wrapper 缺少一套长期维护的 destructive Git command corpus / parser regression suite,导致同类高风险 case 依赖 reviewer 逐轮发现,耗时高且容易漏掉新等价形态。

产品解决方案

为所有 repo-native Git 授权 wrapper 建立“破坏性命令语料库 + 安全解析回归测试”。

用户视角:以后修改主干保护、history rewrite、PR cleanup 等 Git wrapper 时,常见危险 Git 写法会在本地测试阶段一次性暴露,而不是在 Standards review 中逐轮返工。

详细技术实现方案

  1. 新增集中式命令语料,例如 scripts/research/governance/git_command_safety_cases.py 或测试 fixture:
    • destructive push:force、force-with-lease、mirror、delete、prune、+ refspec、: refspec。
    • Git global options:git -C . push ...git -c key=value push ...git --git-dir ... push ...
    • short option clusters:-uf-vf-d 组合。
    • long option abbreviations:--for--mir--del--pru
    • branch / checkout / switch destructive forms。
  2. 所有危险 case 使用 fake runner,断言 wrapper 在调用子进程前拒绝,避免执行真实 destructive Git。
  3. 明确 safe allowlist:
    • ref-sync 只允许 git merge --ff-only origin/main
    • direct-write 只允许非 destructive Git 子命令,并拒绝 Git global option 形态,除非未来设计出完整解析器。
  4. 在 governance audit 中检查关键测试语料存在,避免后续重构删除。
  5. 增加一组“等价写法”回归测试,证明同一语义的缩写、组合、refspec 形态都会得到同一拒绝结论。
  6. 文档更新:pr-workflow.md / governance.md 只描述策略,不列完整危险命令清单;完整清单以测试 fixture 为机器 SSOT。

Acceptance criteria

  • 主干授权 wrapper 的 destructive Git command corpus 集中维护。
  • destructive push 的 refspec、short option cluster、long option abbreviation 都有测试覆盖。
  • Git global option 形态有明确拒绝或解析策略。
  • 测试全程使用 fake runner,不执行真实 destructive Git。
  • governance audit 能发现关键安全语料缺失。

Blocked by

None - can start immediately

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions