本文目录导读:

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 会在提交前自动验证会议纪要的完整性和格式规范性。