Git钩子脚本如何检查会议纪要

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查会议纪要

  1. 使用 pre-commit 钩子检查会议纪要格式
  2. 使用 commit-msg 钩子检查提交消息中的会议引用
  3. 使用 pre-receive 钩子进行服务端检查
  4. 更完善的预检查脚本示例
  5. 安装钩子脚本
  6. 测试钩子脚本

Git 钩子脚本可以通过多种方式检查会议纪要,以下是几种常用的实现方案:

使用 pre-commit 钩子检查会议纪要格式

.git/hooks/pre-commit:

#!/bin/bash
# 检查会议纪要文件存在性和格式
MEETING_DIR="docs/meetings/"
MEETING_PATTERN="*.md"
# 获取所有暂存的会议纪要文件
STAGED_MEETINGS=$(git diff --cached --name-only | grep "^${MEETING_DIR}.*${MEETING_PATTERN}")
if [ -n "$STAGED_MEETINGS" ]; then
    for file in $STAGED_MEETINGS; do
        echo "检查会议纪要: $file"
        # 检查必需字段
        errors=0
        # 检查标题是否存在
        if ! grep -q "^# " "$file"; then
            echo "错误: $file 缺少标题"
            ((errors++))
        fi
        # 检查日期字段
        if ! grep -q "日期:" "$file" && ! grep -q "Date:" "$file"; then
            echo "错误: $file 缺少日期"
            ((errors++))
        fi
        # 检查参与者字段
        if ! grep -q "参与人:" "$file" && ! grep -q "Participants:" "$file"; then
            echo "错误: $file 缺少参与者列表"
            ((errors++))
        fi
        # 检查会议结论
        if ! grep -q "" "$file" && ! grep -q "Decision:" "$file"; then
            echo "错误: $file 缺少会议结论"
            ((errors++))
        fi
        # 检查待办事项
        if ! grep -q "TODO\|待办\|Action Item" "$file"; then
            echo "警告: $file 没有待办事项"
        fi
        if [ $errors -gt 0 ]; then
            echo "⚠️ 会议纪要格式检查失败: $file"
            exit 1
        fi
        echo "✅ $file 格式检查通过"
    done
fi
exit 0

使用 commit-msg 钩子检查提交消息中的会议引用

.git/hooks/commit-msg:

#!/bin/bash
COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
# 检查提交消息是否引用会议纪要
if echo "$COMMIT_MSG" | grep -q "会议\|meeting\|MEETING"; then
    # 检查是否包含会议编号或链接
    if ! echo "$COMMIT_MSG" | grep -q "\#MEETING-[0-9]\|会议编号:"; then
        echo "⚠️  提交消息提到会议,请添加会议编号(格式:#MEETING-xxx 或 会议编号:xxx)"
        exit 1
    fi
fi
# 检查是否包含TODO标记
if echo "$COMMIT_MSG" | grep -q "TODO\|FIXME\|HACK"; then
    echo "⚠️  提交消息包含 TODO/FIXME/HACK 标记"
    read -p "是否继续提交?(y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi
exit 0

使用 pre-receive 钩子进行服务端检查

.git/hooks/pre-receive (服务端):

#!/bin/bash
# 读取标准输入
while read oldrev newrev refname; do
    # 只检查 master/main 分支
    if [[ "$refname" =~ ^refs/heads/(master|main)$ ]]; then
        # 获取所有修改的文件列表
        FILES=$(git diff --name-only $oldrev $newrev)
        # 检查会议纪要目录下的文件
        MEETING_FILES=$(echo "$FILES" | grep "^docs/meetings/")
        if [ -n "$MEETING_FILES" ]; then
            for file in $MEETING_FILES; do
                # 获取文件内容
                content=$(git show $newrev:$file 2>/dev/null)
                # 检查必需的内容
                if ! echo "$content" | grep -q "" && \
                   ! echo "$content" | grep -q "Decision:"; then
                    echo "错误: $file 缺少会议结论"
                    exit 1
                fi
            done
        fi
    fi
done
exit 0

更完善的预检查脚本示例

.git/hooks/pre-commit (完整版):

#!/bin/bash
# 配置
MEETING_DIR="docs/meetings/"
REQUIRED_FIELDS=(.*"
    "日期:.*"
    "时间:.*"
    "地点:.*"
    "参与人:.*"
    "主持:.*"
    "记录:.*"
    "议程:.*"
    "讨论:.*"
    ".*"
    "待办:.*"
)
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
check_meeting_file() {
    local file=$1
    local errors=0
    local warnings=0
    echo -e "${YELLOW}检查会议纪要: $file${NC}"
    # 检查文件编码
    if ! file "$file" | grep -q "UTF-8"; then
        echo -e "${RED}错误: 文件不是UTF-8编码${NC}"
        ((errors++))
    fi
    # 检查必需字段
    for field in "${REQUIRED_FIELDS[@]}"; do
        if ! grep -qE "^$field" "$file"; then
            echo -e "${RED}缺少必需字段: $field${NC}"
            ((errors++))
        fi
    done
    # 检查时间格式
    if grep -q "时间:" "$file"; then
        time_line=$(grep "时间:" "$file")
        if ! echo "$time_line" | grep -qE "[0-9]{1,2}:[0-9]{2}"; then
            echo -e "${YELLOW}警告: 时间格式不规范${NC}"
            ((warnings++))
        fi
    fi
    # 检查日期有效性
    if grep -q "日期:" "$file"; then
        date_line=$(grep "日期:" "$file")
        if ! date -d "$(echo $date_line | sed 's/.*://')" &>/dev/null; then
            echo -e "${RED}错误: 无效的日期格式${NC}"
            ((errors++))
        fi
    fi
    # 检查待办事项格式
    if grep -q "待办:" "$file"; then
        todo_count=$(grep -c "待办:" "$file")
        if [ "$todo_count" -lt 2 ]; then
            echo -e "${YELLOW}警告: 待办事项数量较少 (${todo_count})${NC}"
            ((warnings++))
        fi
    fi
    # 检查文件大小
    file_size=$(wc -c < "$file")
    if [ "$file_size" -lt 100 ]; then
        echo -e "${YELLOW}警告: 文件内容过短 (${file_size} 字节)${NC}"
        ((warnings++))
    fi
    # 输出结果
    if [ $errors -gt 0 ]; then
        echo -e "${RED}❌ 检查失败: $file ($errors 个错误)${NC}"
        return 1
    fi
    if [ $warnings -gt 0 ]; then
        echo -e "${YELLOW}⚠️  检查通过但有警告 ($warnings 个警告)${NC}"
    else
        echo -e "${GREEN}✅ 检查通过: $file${NC}"
    fi
    return 0
}
# 获取暂存的会议纪要文件
STAGED_FILES=$(git diff --cached --name-only | grep "^${MEETING_DIR}.*\.md$")
if [ -n "$STAGED_FILES" ]; then
    echo "开始检查会议纪要文件..."
    all_pass=true
    for file in $STAGED_FILES; do
        if ! check_meeting_file "$file"; then
            all_pass=false
        fi
    done
    if [ "$all_pass" = false ]; then
        echo -e "${RED}\n⚠️  会议纪要检查未通过,提交被阻止${NC}"
        echo "请修正上述错误后重新提交"
        exit 1
    fi
    echo -e "${GREEN}\n✅ 所有会议纪要检查通过${NC}"
fi
exit 0

安装钩子脚本

# 赋予执行权限
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/commit-msg
# 或使用 husky (npm 项目)
npx husky add .husky/pre-commit "bash .git/hooks/pre-commit"

测试钩子脚本

# 创建测试会议纪要
cat > docs/meetings/test-meeting.md << 'EOF'
# 测试会议纪要
日期:2024-01-15
时间:14:00-15:00
地点:会议室A
参与人:张三、李四
主持:王五
记录:赵六
议程:
1. 项目进度汇报
2. 问题讨论
讨论:
- 当前进度符合预期
- 需要增加测试资源

同意增加测试资源
待办:
- [ ] 李四:更新项目计划
- [ ] 王五:协调测试资源
EOF
# 尝试提交
git add docs/meetings/test-meeting.md
git commit -m "添加测试会议纪要"

这样配置后,Git 会在提交前自动验证会议纪要的完整性和格式规范性。

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