如何阻止文件被提交到代码仓库?如何通过GitHub Action实现提交校验?
阻止文件提交到代码仓库的实现方案
完全可以实现不符合要求的文件提交拦截,你描述的校验场景可以通过GitHub Actions+分支保护规则实现远程强制拦截,也可以搭配本地pre-commit钩子在提交阶段提前校验,避免提交到远程后才被驳回。
远程仓库强制拦截实现(GitHub Action)
这个方案不会被本地配置绕过,强制度最高,实现步骤如下:
- 第一步:在仓库中新增GitHub Action工作流配置文件,路径固定为
.github/workflows/file-owner-check.yaml,配置内容如下:
name: 文件Owner标注校验 # 触发规则:所有往主干分支提交的PR都会触发校验 on: pull_request: branches: [ main, master ] # 可替换为你需要保护的所有分支名 jobs: owner-check: runs-on: ubuntu-latest steps: - name: 拉取仓库代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取全量提交记录用于对比文件变更 - name: 执行Owner标注校验 run: | # 获取本次PR变更的所有代码文件,可自行修改后缀过滤规则适配你的业务场景 changed_files=$(git diff --name-only origin/${{ github.base_ref }}...${{ github.head_ref }} | grep -E '\.(js|py|java|go|ts|cpp|c)$' || true) # 无需要校验的文件直接跳过 if [ -z "$changed_files" ]; then echo "无需要校验的代码文件,跳过检查" exit 0 fi check_fail=0 for file in $changed_files; do # 检查文件是否包含目标字符串 if ! grep -q "Owner: Acme" "$file"; then echo "❌ 校验失败:文件 $file 未找到要求的Owner标注「Owner: Acme」" check_fail=1 fi done if [ $check_fail -ne 0 ]; then echo "请在所有不符合要求的文件中添加指定Owner标注后重新提交" exit 1 fi echo "✅ 所有变更文件Owner标注校验通过"
- 第二步:配置分支保护规则,强制要求校验通过才能合并代码:
进入仓库的Settings→Branches→Branch protection rule,给需要保护的主干分支新增保护规则,勾选Require status checks to pass before merging选项,将上面工作流中的owner-check任务添加为必须通过的检查项即可。配置完成后所有往该分支合并的PR,只要存在未添加指定标注的文件,就会被拦截无法合并。
本地提交预校验可选方案
如果希望开发者在本地提交时就提前发现问题,减少远程驳回的情况,可以搭配pre-commit钩子实现本地拦截:
- 安装pre-commit工具后,在仓库根目录新增
.pre-commit-config.yaml配置文件,内容如下:
repos: - repo: local hooks: - id: owner-annotation-check name: 校验文件Owner标注 entry: grep -l "Owner: Acme" language: system files: '\.(js|py|java|go|ts|cpp|c)$' # 替换为你需要校验的文件后缀 pass_filenames: true
- 执行
pre-commit install命令安装钩子后,本地每次执行commit操作都会自动运行校验,不符合要求的提交会被直接拦截。
内容的提问来源于stack exchange,提问作者citizen
相关产品推荐
相关产品推荐

