能否配置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
相关产品推荐
相关产品推荐

