Git钩子脚本如何检查品牌规范

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查品牌规范

  1. 📖 目录导读
  2. 什么是Git钩子 & 为什么需要品牌规范检查
  3. 品牌规范检查的核心要素
  4. 预提交钩子(pre-commit):在本地提交前拦截
  5. 准备钩子(prepare-commit-msg):自动填充或修正提交信息
  6. 提交-接收钩子(commit-msg):验证提交信息
  7. 推送钩子(pre-push):在推送远程前执行完整品牌审核
  8. 实战脚本示例:检查品牌关键词、图片路径与文件名规范
  9. 常见品牌违规案例及脚本应对
  10. 集成CI/CD与远程钩子:确保团队协作的最后一公里
  11. Q&A 问答环节

Git钩子脚本如何检查品牌规范:自动化合规审查的完整指南

📖 目录导读

  1. 什么是Git钩子 & 为什么需要品牌规范检查
  2. 品牌规范检查的核心要素
  3. 预提交钩子(pre-commit): 在本地提交前拦截不合规内容
  4. 准备钩子(prepare-commit-msg): 自动填充或修正提交信息
  5. 提交-接收钩子(commit-msg): 验证提交信息是否符合品牌模板
  6. 推送钩子(pre-push): 在推送远程前执行完整品牌审核
  7. 实战脚本示例:检查品牌关键词、图片路径与文件名规范
  8. 常见品牌违规案例及脚本应对
  9. 集成CI/CD与远程钩子: 确保团队协作的最后一公里
  10. Q&A 问答环节

什么是Git钩子 & 为什么需要品牌规范检查

Git钩子(Git Hooks) 是存储在.git/hooks目录下的可执行脚本,在特定Git事件(如commit、push)触发前或后自动运行,它们就像是代码仓库的“安全检查员”,能在问题进入版本历史之前被发现。

品牌规范检查的必要性

  • 企业品牌资产(如Logo、字体、配色、术语)若被误用或篡改,会损害品牌一致性。
  • 跨团队协作时,开发人员可能无意中引入不合规的资源路径、拼写错误或过时的品牌关键词。
  • 自动化检查能节省人工Review时间,并防止合规性问题流入生产环境。

品牌规范检查的核心要素

在编写钩子脚本前,需要明确品牌规范的内容:

检查项 示例规范 脚本如何捕捉
关键词/术语 品牌名必须写为“BrandName”而非“BRANDNAME” 正则匹配文本差异
图片资源路径 所有品牌Logo应位于assets/brand/目录 检查新增文件路径
配色代码 主色必须使用#3B82F6(指定品牌蓝) 扫描CSS/SCSS文件
版权声明 每个文件头部必须有© 2025 BrandName 检查文件头注释
约定名称 不得包含old-前缀的文件名 使用glob模式过滤
邮件签名 对外邮件模板的Footer必须一致 扫描HTML/MD文件

预提交钩子(pre-commit):在本地提交前拦截

作用:在git commit执行前,扫描所有暂存区(staged)的文件,如果发现品牌违规则拒绝提交。

脚本示例(bash)

#!/bin/bash
# .git/hooks/pre-commit
# 定义违规规则
BRAND_KEYWORDS=("BrandName" "BrandColor" "BrandSlogan")
FORBIDDEN_WORDS=("temp-brand" "old-logo" "unreviewed")
# 检查暂存区中所有新增或修改的文件
for file in $(git diff --cached --name-only --diff-filter=ACM); do
  # 检查文件名是否包含禁止词
  for word in "${FORBIDDEN_WORDS[@]}"; do
    if echo "$file" | grep -qi "$word"; then
      echo "❌ 品牌违规:文件名 '$file' 包含禁止词 '$word'"
      exit 1
    fi
  done
  # 检查文件内容是否包含错误品牌名(忽略二进制文件)
  if [[ ! "$file" =~ \.(png|jpg|jpeg|svg|ico|woff2?)$ ]]; then
    for keyword in "${BRAND_KEYWORDS[@]}"; do
      if grep -qn "$keyword" "$file"; then
        echo "✅ 发现品牌关键词 '$keyword' 在 $file"
      fi
    done
    # 检查未授权变体
    if grep -qP "(?i)(\bbrandname\b|\bbrandcolor\b)" "$file"; then
      echo "⚠️ 警告:'$file' 中使用了不精确的品牌大小写"
      exit 1
    fi
  fi
done

要点:使用git diff --cached确保只检查即将提交的内容,未staged的修改不被干扰。


准备钩子(prepare-commit-msg):自动填充或修正提交信息

作用:在提交信息编辑器打开前,自动注入品牌要求的格式模板,

[BRAND-1234] 类型: 简短描述
- 改动说明
- 关联品牌组件

脚本片段

#!/bin/bash
# .git/hooks/prepare-commit-msg
COMMIT_MSG_FILE=$1
# 如果提交信息为空(非merge/amend场景),注入模板
if [ -z "$(head -1 "$COMMIT_MSG_FILE")" ]; then
  cat > "$COMMIT_MSG_FILE" << EOF
#[Brand-XXX] 提交类型: 描述
# 品牌规范:请确保提交信息包含有效Jira编号
# 使用以下前缀:feat/fix/docs/refactor
EOF
fi

提交-接收钩子(commit-msg):验证提交信息

脚本示例

#!/bin/bash
# .git/hooks/commit-msg
MSG=$(cat "$1")
# 必须包含品牌专属编号(如Jira编号)
if ! echo "$MSG" | grep -qE "^\[BRAND-[0-9]+\]"; then
  echo "❌ 提交信息必须以 '[BRAND-XXX]' 开头(如 [BRAND-1234])"
  exit 1
fi
# 禁止包含非品牌术语
if echo "$MSG" | grep -qi "deprecated\|legacy\|outdated"; then
  echo "⚠️ 提交信息包含禁止词汇,请改用品牌推荐的术语(如'archived')"
  exit 1
fi

推送钩子(pre-push):在推送远程前执行完整品牌审核

此钩子适合执行重量级检查

  • 全量扫描所有被推送的分支中是否包含品牌密钥(如API key、内部路径)
  • 检查是否有未通过品牌合规的commit message

脚本示例

#!/bin/bash
# .git/hooks/pre-push
remote="$1"
url="$2"
# 获取即将推送的commits
for commit in $(git rev-list origin/main..HEAD); do
  # 检查该commit的message
  msg=$(git log --format=%B -n1 "$commit")
  if ! echo "$msg" | grep -q "Brand\|品牌"; then
    echo "❌ Commit $commit 缺少品牌引用(应包含'Brand'关键词)"
    exit 1
  fi
  # 检查该commit引入的文件
  for file in $(git diff-tree --no-commit-id -r --name-only "$commit"); do
    # 检查是否包含了过时品牌名(如旧版Logo路径)
    if [[ "$file" == *"old-brand"* ]]; then
      echo "❌ 文件路径包含'old-brand',请迁移至新品牌目录"
      exit 1
    fi
  done
done

实战脚本示例:检查品牌关键词、图片路径与文件名规范

综合脚本(Python版,更易扩展)

#!/usr/bin/env python3
# .git/hooks/pre-commit 或作为独立脚本调用
import subprocess, sys, re
def get_staged_files():
    result = subprocess.run(
        ['git', 'diff', '--cached', '--name-only', '--diff-filter=ACM'],
        capture_output=True, text=True
    )
    return result.stdout.strip().split('\n') if result.stdout else []
def check_brand_compliance(filepath):
    errors = []
    # 规则1:文件名不能包含 'ex-brand', 'old-brand'
    if re.search(r'(ex-brand|old-brand)', filepath, re.IGNORECASE):
        errors.append(f"文件名包含过期品牌前缀: {filepath}")
    # 规则2:图片必须放在 assets/brand/ 目录下
    if filepath.endswith(('.png','.jpg','.svg')) and not filepath.startswith('assets/brand/'):
        errors.append(f"品牌资源必须放入 'assets/brand/' 目录: {filepath}")
    # 规则3:文件内容不能包含错误品牌名称大小写
    if not filepath.endswith(('.png','.jpg','.ico','.woff2')):
        with open(filepath, 'r', errors='ignore') as f:
            content = f.read()
            if re.search(r'BrandName', content) and not re.search(r'BrandName', content):
                pass  # 此处仅为示例,实际需精确匹配
            if re.search(r'color: #000000', content):  # 假设品牌主色非纯黑
                errors.append(f"发现非品牌色 #000000: {filepath}")
    return errors
def main():
    files = get_staged_files()
    all_errors = []
    for f in files:
        if f:  # 避免空字符串
            all_errors.extend(check_brand_compliance(f))
    if all_errors:
        print("❌ 品牌规范违规项:")
        for err in all_errors:
            print(f"  - {err}")
        sys.exit(1)
    else:
        print("✅ 品牌规范检查通过")
if __name__ == "__main__":
    main()

常见品牌违规案例及脚本应对

违规场景 示例 脚本处理方式
使用了旧版Logo文件名 logo-v1.png 禁止包含v1old等字符
拼写错误品牌名 BranName 正则匹配 [Bb]rand[Nn]ame 并报错
使用了非品牌字体 font-family: Arial 扫描CSS文件,只允许font-family: BrandFont
版权年份过期 © 2023 检查当前年份并提示更新
图片路径错误 img/logo.png 而非 assets/brand/logo.png 验证路径是否以assets/brand/开头

集成CI/CD与远程钩子:确保团队协作的最后一公里

本地钩子可以被跳过git commit --no-verify),因此需要远程校验:

  • 在CI/CD中执行品牌检查:在构建阶段运行与本地相同的脚本,使用git loggit diff分析改动。
  • 使用GitHub Actions示例
    name: Brand Compliance Check
    on: [push, pull_request]
    jobs:
    brand-check:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v4
        - name: Run brand hook script
          run: bash .github/scripts/brand-check.sh
  • 服务端钩子(如Gitea/GitLab):通过pre-receive钩子拒绝不合规推送。

Q&A 问答环节

Q1:Git钩子脚本存储在本地,如何让团队所有成员都生效?
A:将脚本放在项目根目录的scripts/hooks/下,然后通过git init后复制到.git/hooks/,或使用git config core.hooksPath scripts/hooks让Git自动读取。

Q2:品牌规范检查主要针对哪些文件类型?
A:建议覆盖文本文件(.md、.html、.js、.css、.py等)和品牌资源文件(.svg、.png、.jpg、.ico),二进制文件(.exe、.zip)可跳过。

Q3:如何避免钩子脚本运行过慢?
A:限制扫描范围(只检查staged文件)、使用git diff只查增量内容、对大型二进制文件跳过内容扫描。

Q4:如果团队使用了不同的品牌规范版本怎么办?
A:在项目中维护一个BRAND_RULES.json配置文件,脚本读取该文件动态调整规则,支持分支差异化。

Q5:钩子脚本是否支持Windows环境?
A:Bash脚本在Windows的Git Bash下运行,Python脚本需配置Python环境;建议使用跨平台脚本(如Python或Node.js)避免兼容性问题。

抱歉,评论功能暂时关闭!