本文目录导读:

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 会在提交前自动验证会议纪要的完整性和格式规范性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播