You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否配置GitHub拦截超过自定义大小阈值的大文件推送?

GitHub默认大文件管控规则:

  • 尝试添加或更新超过50MB的文件时,Git会发出警告
  • 超过100MB的文件推送请求会被GitHub直接阻止
结论

这个需求完全可以实现。GitHub原生不支持直接自定义全局文件大小拦截阈值,但通过「分支保护规则+自定义CI状态检查」的方案可以达到强制拦截效果,同时也可以搭配纯Git客户端钩子做前置提交提醒。
你猜测的实现方向是对的:分支保护规则支持的自定义状态检查不局限于GitHub Actions,所有可对接GitHub状态接口的CI系统都可作为检查源,其中用GitHub Actions实现是成本最低、无需额外部署服务的方案。

GitHub侧强制拦截配置步骤

这个方案属于服务端强管控,所有协作者都无法绕过,是最可靠的实现方式:

  • 第一步:编写文件大小校验的GitHub Actions工作流
    在仓库的.github/workflows/路径下新建工作流配置文件,例如命名为check-file-size.yml,核心逻辑为遍历所有提交/PR中的变更文件,逐个校验大小,超过设定阈值则直接判定任务失败,可直接参考以下配置:
name: Check File Size
on:
  pull_request:
    branches: [ main ] # 替换为实际需要保护的分支名称
  push:
    branches: [ main ]
jobs:
  check-size:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取仓库代码
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: 校验文件大小
        run: |
          # 自定义大小阈值,单位为KB,示例设置为100KB
          THRESHOLD_KB=100
          THRESHOLD_BYTES=$((THRESHOLD_KB * 1024))
          # 识别不同触发场景下的变更文件列表
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            CHANGED_FILES=$(git diff --name-only --diff-filter=AMR ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }})
          else
            CHANGED_FILES=$(git diff --name-only --diff-filter=AMR ${{ github.event.before }} ${{ github.event.after }})
          fi
          echo "本次变更文件列表:$CHANGED_FILES"
          HAS_OVERSIZED=0
          for FILE in $CHANGED_FILES; do
            # 跳过已删除文件和目录
            if [ ! -f "$FILE" ]; then
              continue
            fi
            FILE_SIZE=$(stat -c%s "$FILE")
            if [ $FILE_SIZE -gt $THRESHOLD_BYTES ]; then
              echo "❌ 文件 $FILE 大小超限,阈值为${THRESHOLD_KB}KB,实际大小为$((FILE_SIZE / 1024))KB"
              HAS_OVERSIZED=1
            fi
          done
          if [ $HAS_OVERSIZED -eq 1 ]; then
            echo "存在超过大小限制的文件,本次提交被拦截"
            exit 1
          fi
          echo "✅ 所有文件大小均符合要求"
  • 第二步:配置分支保护规则强制校验生效
    进入仓库设置页的分支规则配置模块,为需要保护的分支新建保护规则,勾选「合并前必须通过状态检查」选项,在可选检查项中选中上述工作流对应的check-size检查项,同时建议勾选「不允许绕过上述设置」,避免管理员权限跳过校验。
    配置完成后,所有向受保护分支的直接推送、PR合并请求,只要包含超过阈值的文件,都会因为校验任务失败被拦截,无法合入目标分支。
纯Git侧补充方案(客户端前置提醒)

GitHub确实不支持自定义服务端pre-receive钩子,但可以通过配置本地客户端钩子,在用户提交时就做大小校验,避免推送到远程后才发现不符合要求:

  • 在本地仓库的.git/hooks/目录下新建pre-commit文件,写入大小校验逻辑,之后给文件添加可执行权限即可,参考逻辑如下:
#!/bin/sh
THRESHOLD_KB=100
THRESHOLD_BYTES=$((THRESHOLD_KB * 1024))
# 读取暂存区中新增、修改、重命名的文件
CHANGED_FILES=$(git diff --cached --name-only --diff-filter=AMR)
HAS_OVERSIZED=0
for FILE in $CHANGED_FILES; do
  if [ ! -f "$FILE" ]; then
    continue
  fi
  FILE_SIZE=$(stat -c%s "$FILE")
  if [ $FILE_SIZE -gt $THRESHOLD_BYTES ]; then
    echo "❌ 文件 $FILE 大小超过${THRESHOLD_KB}KB限制,无法提交"
    HAS_OVERSIZED=1
  fi
done
if [ $HAS_OVERSIZED -eq 1 ]; then
  exit 1
fi
exit 0

注意:这个方案属于客户端侧校验,用户可以通过加--no-verify参数手动跳过,因此仅适合做前置提醒,强管控还是要依赖上述GitHub侧的配置。

内容的提问来源于stack exchange,提问作者Albert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:51:48